前言
在iOS項目中使用第三方類庫可以說是非常常見的事,但是要正確地配置他們有時候是非常繁瑣的事情,幸運的是CocoaPods是一個很好的解決方案。
什麼是CocoaPods
CocoaPods是OS X和iOS下的一個第三類庫管理工具,通過CocoaPods工具我們可以爲項目添加被稱爲“Pods”的依賴庫(這些類庫必須是CocoaPods本身所支持的),並且可以輕鬆管理其版本。
Cocoapods意義體現在兩個方面。第一,在引入第三方庫時它可以自動爲我們完成各種各樣的配置,包括配置編譯階段、連接器選項、甚至是ARC環境下的-fno-objc-arc配置等。第二,使用CocoaPods可以很方便地查找新的第三方庫,這些類庫是比較“標準的”,而不是網上隨便找到的,這樣可以讓我們找到真正好用的類庫。
接下來我們將介紹CocoaPods的使用。
CocoaPods的核心組件
CocoaPods是用Ruby寫的,並劃分成了若干個Gem包。
CocoaPods在解析執行過程中最重要的幾個包的路徑分別是:CocoaPods/CocoaPods、CocoaPods/Core和 CocoaPods/Xcodeproj。
CocoaPods / CocoaPod:這是面向用戶的組件,每當執行一個pod命令時,這個組件將被激活。它包括了所有實用CocoaPods的功能,並且還能調用其他gem包來執行任務。
CocoaPods / Core:Core gem提供了與CocoaPods相關的文件(主要是podfile和podspecs)的處理。
Podfile:該文件用於配置項目所需要的第三方庫,它可以被高度定製。本文中我們主要在這裏做動作。
Podspec:該文件描述了一個庫將怎樣被添加進工程中。.podspec文件可以標識該第三方庫所需要的源碼文件、依賴庫、編譯選項,以及其他第三方庫需要的配置。
CocoaPods / Xcodeproj:這個包負責處理工程文件,它能創建以及修改.xcodeproj文件和.xcworkspace文件。它也可以作爲一個獨立的包使用,當你要編寫修改項目文件的腳本時,可以考慮使用CocoaPods/Xcodeproj。
場景1:安裝和使用 CocoaPods
由於網上的教程基本都大同小異,但細節之處還不是很完善,所以藉機會在這裏補充下:
注:要使用CocoaPods,那就要下載安裝它,而下載安裝CocoaPods需要Ruby環境
a 查看下當前ruby版本:打開終端輸入 ruby -v(確實安裝了,不過用這個版本接下來工作失敗了,所以更新下ruby)
- ritekiMac-mini:PodTest lucky$ ruby -v
- ruby 1.8.7 (2012-02-08 patchlevel 358) [universal-darwin12.0]
- ritekiMac-mini:PodTest lucky$
b、升級Ruby環境
終端輸入:$gem update --system
此時會出現
ERROR: While executing gem ... (Gem::FilePermissionError)
You don‘t have write permissions for the /Library/Ruby/Gems/2.0.0 directory.
zijingMacBook-Pro:~ shiyunlei$ sudo gem update --system
這個是因爲你沒有權限去更新Ruby
這個時候你可以在終端使用:$sudo gem update --system來進行升級
這個時候表示Ruby升級完成。
c、安裝CocoaPods時我們要訪問cocoapods.org,該網站可能被我們大天朝牆了,這樣下載安裝可能會是龜速,幸好我們可以用淘寶的Ruby鏡像來訪問該網站。
注意:
淘寶已經關閉HTTP協議的景象服務,改爲HTTPS協議。
淘寶ruby地址:https://ruby.taobao.org/
方法如下:1、gem sources --remove https://rubygems.org/
2、gem sources -a http://ruby.taobao.org/
可以使用下面的命令(紅色部分)查看是否更換鏡像成功(如下圖所示):
$ gem sources -l
d、安裝Cocoapods,在終端輸入命令
$sudo gem install cocoapods
這個時候會提示你輸入密碼,注:在終端輸入密碼不會有提示,光標也不會移動,一定要注意
注意:如果在安裝時出現以下或類似錯誤
ERROR: While executing gem ... (Errno::EPERM)
Operation not permitted - /usr/bin/fuzzy_match
處理方案如下:第一個方案我驗證失敗了
開始安裝,如下圖:PS:這個過程可能花費時間比較長
安裝成功如下:
e、使用search命令搜索類庫名:
$pod search AFNetworking
注意:如果出現 Setting up CocoaPods master repo,說明Cocoapods在將它的信息下載到 ~/.cocoapods裏;
cd 到該目錄裏,用du -sh *命令來查看文件大小,每隔幾分鐘查看一次,這個目錄最終大小大概有200多M(我的是297M)
如果CocoaPods支持,將會輸出搜索到的所有類庫版本和信息,以及在Podfile中配置的寫法,終端返回信息如下:
-> AFNetworking (2.3.1)
A delightful iOS and OS X networking framework.
pod ‘AFNetworking‘, ‘~> 2.3.1’(這個語句是需要在編輯Podfile的時候輸入的命令,即是如何安裝下載相關類庫的指令)
- Homepage: https://github.com/AFNetworking/AFNetworking
- Source: https://github.com/AFNetworking/AFNetworking.git
- Versions: 2.3.1, 2.3.0, 2.2.4, 2.2.3, 2.2.2, 2.2.1, 2.2.0, 2.1.0,
2.0.3, 2.0.2, 2.0.1, 2.0.0, 2.0.0-RC3, 2.0.0-RC2, 2.0.0-RC1, 1.3.4, 1.3.3,
1.3.2, 1.3.1, 1.3.0, 1.2.1, 1.2.0, 1.1.0, 1.0.1, 1.0, 1.0RC3, 1.0RC2, 1.0RC1,
0.10.1, 0.10.0, 0.9.2, 0.9.1, 0.9.0, 0.7.0, 0.5.1 [master repo]
- Sub specs: - AFNetworking/Serialization (2.3.1) -
AFNetworking/Security (2.3.1) - AFNetworking/Reachability (2.3.1) -
AFNetworking/NSURLConnection (2.3.1) - AFNetworking/NSURLSession (2.3.1)
- AFNetworking/UIKit (2.3.1)
-> AFNetworking+AutoRetry (0.0.5)
Auto Retries for AFNetworking requests
pod ‘AFNetworking+AutoRetry‘, ‘~> 0.0.5‘
- Homepage: https://github.com/shaioz/AFNetworking-AutoRetry
- Source: https://github.com/shaioz/AFNetworking-AutoRetry.git
- Versions: 0.0.5, 0.0.4, 0.0.3, 0.0.2, 0.0.1 [master repo]
5、需要在工程中創建一個Podfile文件,
使用命令:
$cd /Users/shiyunlei/Desktop/CocoapodsSample(進入工程目錄,cd後面的是工程的路徑)
$ touch Podfile(創建Podfile文件)
然後使用vim編輯Podfile文件,使用命令:
$ vim Podfile
進入如下界面
然後緊接着按鍵盤上的“i”鍵,變成如下狀態,這個時候可以對Podfile文件進行編輯:
$platform:ios, ‘7.0‘
$ pod ‘AFNetworking‘, ‘~> 2.3.1‘
在編輯完成後按“esc”,
在按“:”,這個時候輸入wq,點擊回車,保存並退出。
這個時候打開Podfile文件就會看到裏面添加了剛纔在終端輸入的一行語句,如下圖
然後在終端輸入命令安裝相應的第三方類庫
$pod install
因爲這個過程需要下載相應的類庫,所以時間和網速有關。
安裝成功之後截圖如下:
這個時候會看到之後打開工程都需要從類型爲工程名.xcworkspace文件打開。
場景2:如何正確編譯運行一個包含CocoPods類庫的項目
你也許曾經遇到過(特別是新手iOS開發者)這種情況,好不容易在GitHub上找到一份代碼符合自己想需求,興沖沖下載下來,一編譯,傻眼了,發現有各種各樣錯誤。一看,原來是缺失了各種其他第三方類庫。這時候莫慌,你再仔細一看,會發現你下載的代碼包含了Podfile。沒錯,這意味着你可以用CocoaPods很方便下載所需要的類庫。
下面,小編以代碼 UAAppReviewManager 爲例來說明如何正確編譯運行一個包含CocoPods類庫的項目。
UAAppReviewManager是一個能夠讓你方便地將提醒用戶評分的功能加入你的應用中。當你去UAAppReviewManager的GitHub地址下載這份代碼之後,打開Example工程(UAAppReviewManagerExample),編譯,你會發現Xcode報告一大堆錯誤,基本都是說你編譯的這份代碼找不到某某頭文件,這就意味着你要成功編譯UAAppReviewManager的Example代碼,必須先導入一些第三方類庫。同時你會發現在UAAppReviewManagerExample文件夾下面有三個跟CocosPods相關的文件(文件夾):Podfile,Podfile.lock和Pods
這時候,打開終端,進入UAAppReviewManagerExample所在的目錄,也就是和Podfile在同一目錄下,和場景1一樣,輸入以下命令(由於已經有Podfile,所以不需要再創建Podfile):
$ pod update
過幾秒(也許需要十幾秒,取決於你的網絡狀況)之後,終端出現:
Analyzing dependencies
Fetching podspec for `UAAppReviewManager` from `../`
Downloading dependencies
Installing UAAppReviewManager (0.1.6)
Generating Pods project
Integrating client project
[!] From now on use `UAAppReviewManagerExample.xcworkspace`.
這時候,再回到UAAppReviewManagerExample文件夾看一看,會看到多了一個文件UAAppReviewManagerExample.xcworkspace:
根據終端的信息提示,你以後就需用新產生的UAAppReviewManagerExample.xcworkspace來運行這個Example代碼了。
打開UAAppReviewManagerExample.xcworkspace,編譯運行,成功!
注意,這裏有個小問題,如果剛剛你不是輸入$ pod update
,而是輸入$ pod install
,會發現類庫導入不成功,並且終端出現下面提示:
[!] Required version (UAAppReviewManager (from `../`)) not found for `UAAppReviewManager`.
Available versions: 0.1.6
這裏的意思大概是Podfile文件過期,類庫有升級,但是Podfile沒有更改。$ pod install
只會按照Podfile的要求來請求類庫,如果類庫版本號有變化,那麼將獲取失敗。但是 $ pod update
會更新所有的類庫,獲取最新版本的類庫。而且你會發現,如果用了 $ pod update
,再用 $
pod install
就成功了。
那你也許會問,什麼時候用 $ pod install
,什麼時候用 $ pod update
呢,我又不知道類庫有沒有新版本。好吧,那你每次直接用 $ pod update
算了。或者先用 $ pod install
,如果不行,再用 $ pod update
。
好了,小編就囉嗦到這裏吧。上述都只是CocoaPods的最基本用法。要繼續研究CocoaPods其他高級用法,請點擊這裏CocoaPods Wiki。