CocoaPods的學習

一、什麼是CocoaPods

1、爲什麼需要CocoaPods

在進行iOS開發的時候,總免不了使用第三方的開源庫,比如SBJson、AFNetworking、Reachability等等。使用這些庫的時候通常需要:

  • 下載開源庫的源代碼並引入工程
  • 向工程中添加開源庫使用到的framework
  • 解決開源庫和開源庫以及開源庫和工程之間的依賴關係、檢查重複添加的framework等問題
  • 如果開源庫有更新的時候,還需要將工程中使用的開源庫刪除,重新執行前面的三個步驟,頓時頭都大了。。。

自從有了CocoaPods以後,這些繁雜的工作就不再需要我們親力親爲了,只需要我們做好少量的配置工作,CocoaPods會爲我們做好一切!

2、什麼是CocoaPods

CocoaPods是一個用來幫助我們管理第三方依賴庫的工具。它可以解決庫與庫之間的依賴關係,下載庫的源代碼,同時通過創建一個Xcode的workspace來將這些第三方庫和我們的工程連接起來,供我們開發使用。

使用CocoaPods的目的是讓我們能自動化的、集中的、直觀的管理第三方開源庫。


二、安裝CocoaPods

1、安裝

CocoaPods是用Ruby實現的,要想使用它首先需要有Ruby的環境。幸運的是OS X系統默認的已經可以運行Ruby了,因此我們只需要執行以下命令:

[objc] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. $ sudo gem install cocoapods  
CocoaPods是以Ruby gem包的形式被安裝的。在安裝執行的過程中,可能會問我們是不是更新rake,輸入y即可。這是因爲rake gem包會在安裝的過程中檢查更細,如果有可用的新版本就會出現剛纔的選項。

在安裝進程結束的時候,執行命令:

[objc] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. $ pod setup  
如果沒有報錯,就說明一切安裝就成功了!

2、安裝過程中可能遇到的問題

①執行完install命令半天沒反應

這有可能是因爲Ruby的默認源使用的是cocoapods.org,國內訪問這個網址有時候會有問題,網上的一種解決方案是將遠替換成淘寶的,替換方式如下:

[objc] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. $ gem sources --remove https://rubygems.org/  
  2. //等有反應之後再敲入以下命令  
  3. $ gem sources -a http://ruby.taobao.org/  
要想驗證是否替換成功了,可以執行:
[objc] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. $ gem sources -l  
正常的輸出是:
[objc] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. *** CURRENT SOURCES ***  
  2.   
  3. http://ruby.taobao.org/  

②gem版本過老

gem是管理Ruby庫和程序的標準包,如果它的版本過低也可能導致安裝失敗,解決方案自然是升級gem,執行下述命令即可:

[objc] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. $ sudo gem update --system  

③安裝完成後,執行pod setup命令時報錯:

[objc] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. /Users/wangzz/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/site_ruby/1.9.1/rubygems/dependency.rb:298:in `to_specs': Could not find 'cocoapods' (>= 0) among 6 total gem(s) (Gem::LoadError)  
  2.     from /Users/wangzz/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/site_ruby/1.9.1/rubygems/dependency.rb:309:in `to_spec'  
  3.     from /Users/wangzz/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/site_ruby/1.9.1/rubygems/core_ext/kernel_gem.rb:53:in `gem'  
  4.     from /Users/wangzz/.rvm/rubies/ruby-1.9.3-p448/bin/pod:22:in `<main>'  
這就是路徑設置的問題,可以通過執行:
[objc] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. $ rvm use ruby-1.9.3-p448  
解決該問題。

3、升級CocoaPods

升級很簡單,再次執行安裝命令即可:

[objc] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. $ sudo gem install cocoapods  
需要注意的是,如果安裝的時候使用了sudo,升級的時候一樣需要使用該關鍵字,不然升級完了以後又會出現路徑不匹配問題。


三、使用CocoaPods

如果之前做的一切順利,接下來就可以體驗體驗CocoaPods的神奇之處了,需要經過以下幾步:

爲了演示這個過程,我創建了一個名爲CocoaPodsTest的工程。

1、創建Podfile

CocoaPods的一切都是從一個名爲Podfile的文件開始的,我們需要先創建這個文件。個人習慣使用命令行,我會這樣做:

[objc] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. $ cd /Users/wangzz/Desktop/CocoaPodsTest  
  2. $ touch Podfile  
首先進入到工程的根目錄下,創建空白的Podfile文件,創建完畢的目錄結構如下圖:



(PS:Podfile文件也可以不放在工程的根目錄下,只是會稍微麻煩點,在下一篇文章中會有介紹,敬請關注。)

2、編輯Podfile

根據需要,我們可以在Podfile文件中寫入需要用到的第三方庫,以SBJson、AFNetworking、Reachability三個庫爲例,我的Podfile內容如下:

[objc] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. platform :ios  
  2. pod 'Reachability',  '~> 3.0.0'  
  3. pod 'SBJson''~> 4.0.0'  
  4.   
  5. platform :ios, '7.0'  
  6. pod 'AFNetworking''~> 2.0'  

3、執行導入命令

準備工作都完成後,開始導入第三方庫:

[objc] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. $ cd /Users/wangzz/Desktop/CocoaPodsTest  
  2. $ pod install  
首先進入工程根目錄,然後執行pod install命令,CocoaPods就開始爲我們做下載源碼、配置依賴關係、引入需要的framework等一些列工作,命令的執行結果打印出來如下:
[objc] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. Analyzing dependencies  
  2. Downloading dependencies  
  3. Installing AFNetworking (2.1.0)  
  4. Installing JSONKit (1.5pre)  
  5. Installing Reachability (3.0.0)  
  6. Generating Pods project  
  7. Integrating client project  
  8.   
  9. [!] From now on use `CocoaPodsTest.xcworkspace`.  
這就說明pod install命令執行成功了。再來看看工程根目錄發生的變化,如下圖:


可以看到,工程的根目錄下多了三個東西:CocoaPodsTest.xcworkspace、Podfile.lock文件和Pods目錄。

(PS:篇幅有限,Podfile.lock文件會放到系列文章的下一篇介紹,敬請關注。)


再看看剛纔執行完pod install命令打印出來的內容的最後一行:

[objc] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. [!] From now on use `CocoaPodsTest.xcworkspace`.  
提示我們從現在起,我們需要使用CocoaPodsTest.xcworkspace文件來開發。

對於工程發生的變化,有幾點需要說明:

  • 第三方庫會被編譯成靜態庫供我們正真的工程使用

CocoaPods會將所有的第三方庫以target的方式組成一個名爲Pods的工程,該工程就放在剛纔新生成的Pods目錄下。整個第三方庫工程會生成一個名稱爲libPods.a的靜態庫提供給我們自己的CocoaPodsTest工程使用。

  • 我們的工程和第三方庫所在的工程會由一個新生成的workspace管理

爲了方便我們直觀的管理工程和第三方庫,CocoaPodsTest工程和Pods工程會被以workspace的形式組織和管理,也就是我們剛纔看到的CocoaPodsTest.xcworkspace文件。

原來的工程設置已經被更改了,這時候我們直接打開原來的工程文件去編譯就會報錯,只能使用新生成的workspace來進行項目管理。

打開CocoaPodsTest.xcworkspace,界面如下:

工程的目錄結構還是非常明顯的。

在項目中引用剛纔添加的第三方庫的頭文件,執行編譯操作,果斷成功!

正確編譯運行一個包含CocoaPods類庫的項目

如果一個項目中已經包含了CocoaPods的配置文件,但是編譯卻出現錯誤,那麼我們僅需要一行命令就可以配置好所有的第三方類庫了:

 

1.$ pod update

參考Demo的項目地址:https://github.com/UrbanApps/UAAppReviewManager

 

打開Demo的UAAppReviewManagerExample目錄,可以發現少了一個xcworkspace文件,另外還有幾個CocoaPods的配置文件在這裏:

\

打開Podfile文件看看:

 

01.target 'UAAppReviewManagerExampleiOS' do
02.platform :ios, '5.1'
03.pod 'UAAppReviewManager', :path => '..'
04.end
05. 
06.target 'UAAppReviewManagerExampleMac' do
07.platform :osx, '10.7'
08.pod 'UAAppReviewManager', :path => '..'
09.end

 

platform表示類庫支持的最高版本,該類庫的target包括了iOS和Mac。而path指定了到上級目錄去查找該類庫的安裝信息。

編譯工程,將會出錯,原因是我們沒有將類庫鏈接到工程中:

\

因此我們要用pod命令進行安裝。cd到Example目錄下執行pod install命令,將會報錯:

 

1.$ pod install
2.Analyzing dependencies
3.Fetching podspec for `UAAppReviewManager` from `..`
4.[!] Unable to satisfy the following requirements:
5.- `UAAppReviewManager (from `..`)` required by `Podfile`

 

原因是要添加的類庫已經有最新版本推出,而Podfile文件並沒有更改其下載版本(Podfile文件過期),於是獲取安裝數據失敗。

因此我們要用update命令獲取最新版本的類庫:

 

01.$ pod update
02.Analyzing dependencies
03.Fetching podspec for `UAAppReviewManager` from `..`
04.Downloading dependencies
05.Installing UAAppReviewManager (0.2.1)
06.Generating Pods project
07.Integrating client project
08. 
09.[!] From now on use `UAAppReviewManagerExample.xcworkspace`.

同樣地我們成功生成了xcworkspace文件:

 

\

再編譯運行就沒問題了。

補充

當Cocoapods向項目中增加了一個第三方庫的時候,不僅僅只是添加代碼,由於每個第三方類庫有不同的target,所以每次添加第三方庫時,都會有幾個文件被寫入磁盤,包括Podfile.lock和Manifest.lock文件等。

其中Podfile.lock記錄了需要被安裝的pod的每個已安裝的版本。如果你想知道已安裝的pod是哪個版本,可以查看這個文件。

Manifest.lock是每次運行pod install時創建的Podfile.lock文件的副本。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章