前言
對於iOS App的開發,幾乎都采用了Cocoapods來管理第三方庫,那么對於我們開發人員來說,這是必備技能,必須要掌握如何使用。這篇文章就是介紹如何安裝和使用CocoaPods的。
這篇文章對哪些人群參考價值?
- 對未使用過Cocoapods的人群有參考價值
- 對使用過Cocoapods,但是未深入了解過的用戶有參考價值
- 對有開源精神的,希望將自己的代碼貢獻到Cocoapods的用戶有參考價值
如果您不屬於以上人群,您是可以不閱讀本篇文章的,當然閱讀完也會有很大的幫助。
溫馨提示:在篇文章中所使用的Xcode版本為Xcode7.
什么是CocoaPods?
簡單來說,就是專門為iOS工程提供對第三方庫的依賴的管理工具,通過CocoaPods,我們可以單獨管理每個第三方庫,可以更方便地管理每個第三方庫的版本,而且不需要我們做太多的配置,直接交由提供支持CocoaPods項目的作者來配置了,如此便可直觀、集中和自動化地管理我們項目的第三方庫。
為什么需要使用CocoaPods?
我們也許有過這樣的感受: 每添加一個第三方庫、Framework或者SDK,我們都需要手動添加相關依賴庫,在工程buildsetting
中配置路徑,在build phases中添加依賴的系統庫。如果所導入的第三方庫還依賴其他第三方庫,我們也需要手動導入且分別添加工程配置。
當我們需要更新某個第三方庫的時候,我們又要手動移除該庫,導入新的庫,然后再配置,這是相當麻煩且沒有意義的工作。當使用CocoaPods管理后,我們只需要修改為某個版本,再執行pod update即可。
當我們需要去掉某個第三方庫時,我們是怎么做的呢?是不是將該庫移除掉,然后還得把相關配置也移除掉,這樣工作才干凈。是不是很麻煩呢?當我們使用Cocoapods管理后,我們是怎么做的?只需要在Podfile刪除該引入該庫的語句,然后執行pod update即可。
當我們開始使用CocoaPods管理第三方庫后,我們只需要相當少的配置,其它的一切都交由CocoaPods來管理即可,我們使用起來就更省心了。
如何安裝CocoaPods?
CocoaPods is built with Ruby and is installable with the default Ruby available on OS X. We recommend you use the default ruby.
也就是說CocoaPods是通過Ruby來安裝的,MAC OSX都有一個默認的Ruby版本,推薦我們通過默認的Ruby來安裝CocoaPods。
使用下面的命令安裝:
sudo gem install cocoapods
事實上,這樣安裝未必能安裝成功,因為默認的cocoapods網址是國外的,需要VPN才能訪問,因此我們可以改一種方式:
1、先輸入 gem sources --remove https://rubygems.org/ 2、等待有反映后,再輸入 gem source -a https://ruby.taobao.org/ 3、驗證是否成功替換:gem source -l 4、最后就可以通過sudo gem install cocoapods正常安裝cocoapods了。
等待安裝完成后,就可以開始使用CocoaPods
了。
注意:source
或者sources
都可以.
如何使用CocoaPods?
要使用CocoaPods
,就需要一個Podfile
文件。我們是如何為所有的工程建立Podfile
的,下面的方式是基本的方式。
cd Desktop/Demos/KVODEMO
touch Podfile
vim Podfile
- 第一步:進入到我們所建立的工程的目錄,這里是
KVODEMO
- 第二步:通過
touch
命令新建Podfile
- 第三步:通過
vi Podfile
進入編輯Podfile
- 第四步:添加第三方庫,如下圖,我們添加了
AFNetworking
和ObjectiveSugar
庫,其中我們添加的AFNetworking
版本是2.0版本,ObjectiveSugar
版本是0.5.
pod 'AFNetworking', ' 2.0' pod 'ObjectiveSugar', ' 0.5'
- 按下
esc
鍵,然后輸入:wq
,就可以保存了。然后在終端輸入pod install
,就可以安裝第三方庫了。
在安裝完成后,我們不再是打開后綴為.xcodeproj
的工程,而是打開后綴為.xcworkspace
的工作空間了。
關於Podfile更高級的使用,請參考官方文檔
或者關注后續文章!
在Objective-C工程中的使用
在工程中,我們只需要通過引入改文件就可以直接使用了,比如我們引入了第三方庫Masonry
(純代碼自動布局),我們在Objective-C
工程中就可以通過import
頭文件即可。
#import <Masonry.h>
注意,如果這么做提示找不到頭文件,那么我們可以嘗試這么引入:#import "Masonry.h"
或者通過#import "Masonry/Masonry.h"
如果仍然沒有效果,那么需要在工程配置一下.在工程的Build Settings
搜索Search Paths
,然后在User header search paths
中添加$(SRCROOT)
並選擇recursive
(也就是遞歸查找)
在Swift工程中的使用
我相信大家在Swift
工程中使用CocoaPods
也遇到了不少問題,尤其是如何import
模塊問題。 當初我遇到這種問題時,也在網上搜索了很多的資料,但是都不是我希望的方案。在網上有兩種方式: 通過Swift工程可以橋接Objectice-C
的方式,建立一個Bridge-head.h
(名字隨便起),然后進入到Build Settings
,在搜索框中輸入bridg
,找到Objective-C Bridging Header
,選項,把頭文件的路徑賦值給該選項。如下所示:
也就是:工程名/橋接文件名.h。在剛才所建立的橋接文件中,通過#import "頭文件.h"
就可以了。
雖然是Objective-C
第三方庫,事實上我們也可以使用Swift
的方式引入的,也就是通過 import 模塊名
的方式來引入。所以對於上面的方式,我是不喜歡的。那么再看看網上的另一種方式:Swift第三方管理
當然,現在swift出了一個Package Manager,專門管理第三方引用的。
這是通過submodule
的方式來管理的。 創建submodule
,在當前項目的同級目錄下執行類似這樣的命令,如下:
git submodule add https://github.com/Masonry.git
然后將生成的Masonry.xcodeproj
拖入到工程中。 在xcode
工程的general
中,點擊embeded libraries
中的+號,然后改我們的第三方庫framework
,類似下圖:
最后就可以直接在工程中需要使用的地方,通過import
模塊名來使用了。 如果是多人團隊開發,我們就需要共享了,那么其他成員就需要通過下面的命令來安裝:
git submodule update --init --recursive
這是通過遞歸來安裝或者更新submodule
。這是挺麻煩的一件事。然后根據使用的經驗,我們下載別人的工程下來后,執行了上面的命令,安裝好相關模塊了,運行工程經常出現報錯的問題,也就是配置問題。因此,個人很不喜歡這種方式。
事實上,在Xcode7是不再需要這么做了,對於其他Xcode版本是否需要,未驗證。 我們通過cocoapods安裝的第三方庫會自動生成為framework,然后我們只需要在使用的地方直接通過import 模塊名使用即可。但是有時候可能會出現某個第三方庫直接通過import 模塊名時,提示找不到,也就是沒有智能提示。這時候我們可以通過在xcode工程的general中的embeded libraries點擊+,然后導入該framework,就可以正常import了。另外如果導入的第三方庫在運行時,報錯了,類似於:
dyld: Library not loaded: @rpath/ReactiveCocoa.framework/ReactiveCocoa Referenced from: /private/var/mobile/Containers/Bundle/Application/31ABC86A-C1BD-40DD-A117-D2C8F79A98FE/SwiftGithubClient.app/SwiftGithubClient Reason: image not found
那么我們可以這么解決:
在Build Phases->Link Binary With Libraries
->找到出錯的庫的名稱->修改required
為optional
即可。
如何升級CocoaPods版本?
升級CocoaPods是非常簡單的,只需要一個命令即可。 正常情況下,只需要一個命令就可以升級了:
sudo gem install cocoapods
但是有可能需要更新gem
才能升級cocoapods
,因此我們可能需要這么做:
$ sudo gem update --system // 先更新gem,國內需要切換源 $ gem sources --remove https://rubygems.org/ $ gem sources -a http://ruby.taobao.org/ $ gem sources -l CURRENT SOURCES http://ruby.taobao.org/ $ sudo gem install cocoapods // 安裝cocoapods $ pod setup
然后查看版本號:
$ pod --version 0.39.0
CocoaPods可以方便地通過Mac自帶的RubyGems安裝。
打開Terminal(Mac電腦自帶的終端),然后按照以下提示操作即可:
1.設置ruby的軟件源
這是因為ruby的軟件源rubygems.org因為使用亞馬遜的雲服務,被我天朝屏蔽了,需要更新一下ruby的源,過程如下:
gem sources -l #(查看當前ruby的源) gem sources --remove https://rubygems.org/ #(移除當前ruby的源) gem sources -a https://ruby.taobao.org/ #(設置當前ruby的源為我天朝的) gem sources -l #(再次查看當前ruby的源) 如果Terminal輸出: *** CURRENT SOURCES *** https://ruby.taobao.org/
就證明ruby的軟件源已經設置OK了。
2.設置gem為最新版本
如果gem太老,可以嘗試用如下命令升級gem:
在Terminal輸入以下命令:
sudo gem update --system
升級成功后會提示: Latest version currently installed. Aborting.
3.執行安裝CocoaPods命令
注意:OS X 10.11 升級,雖然官方聲稱只是一個小的升級,但對於開發者而言,cocoapods需要重新安裝,但按照以前的安裝方式,在Terminal輸入以下命令:
sudo gem install cocoapods
如果報以下錯誤:
ERROR: While executing gem ... (Errno::EPERM)
Operation not permitted - /usr/bin/xcodeproj
解決方案1:
執行下面的命令並重啟 sudo nvram boot-args="rootless=0" sudo reboot 重啟之后, 執行這個命令檢查 sudo gem install cocoapods -V
如果依舊有錯誤,使用第二個方案
解決方案2:
sudo gem install -n /usr/local/bin cocoapods
pod setup
還有一點需要注意,pod setup在執行時,會輸出Setting up CocoaPods master repo,但是會等待比較久的時間。這步其實是 Cocoapods 在將它的信息下載到 ~/.cocoapods目錄下,如果你等太久,可以試着 cd 到那個目錄,用du -sh *來查看下載進度。
安裝成功后,你會看到:Setup completed
隨便以一種方式新建一個名為Podfile的文件放到你的工程根目錄下(不能寫成別的名字,也可以自己在工程根目錄里面直接新建)
Podfile文件內容的格式應該如下:
platform :ios, '8.0' #(注明你的開發平台以及版本,'8.0'忽略不寫即為最新版本) pod 'AFNetworking', '~> 2.5.3' #('~> 2.5.3'為版本號,忽略不寫即為最新版本) pod 'SDWebImage', '~> 3.7.2'
然后在Terminal進入工程所在的根目錄(工程根目錄)中執行 :
pod install
這樣,AFNetworking和SDWebImage就已經下載完成並且設置好了編譯參數和依賴,以后使用的時候切記如下兩點:
1.從此以后需要使用Cocoapods生成的 .xcworkspace文件來打開工程,而不是使用以前的.xcodeproj文件
2.每次更改了Podfile文件,都需要重新執行一次pod update命令
查找第三方庫:
你如果不知道 cocoaPods 管理的庫中,是否有你想要的庫,那么你可以通過 pod search 命令進行查找,以下是我用 pod search json 查找到的所有可用的庫:
可以在Terminal中輸入:
pod search AFNetworking
回車之后就可以看到和你搜索的關鍵字相關的一些庫類,如圖:

關於 Podfile.lock
當你執行pod install之后,除了 Podfile 外,CocoaPods 還會生成一個名為Podfile.lock的文件,Podfile.lock 應該加入到版本控制里面,不應該把這個文件加入到.gitignore中。因為Podfile.lock會鎖定當前各依賴庫的版本,之后如果多次執行pod install 不會更改版本,要pod update才會改Podfile.lock了。這樣多人協作的時候,可以防止第三方庫升級時造成大家各自的第三方庫版本不一致
附:如何使用CocoaPods的鏡像索引:
所有項目的Podspec文件都托管在https://github.com/CocoaPods/Specs,
第一次執行pod setup時,CocoaPods會將這些podspec索引文件更新到本地的~/.cocoapods目錄下,
這個索引文件比較大,所以第一次更新時非常慢.
友好人士在國內的服務器建立了Cocoapods索引庫的鏡像,
所以執行索引跟新操作時候會快很多.具體操作方法如下:
pod repo remove master pod repo add master https://gitcafe.com/akuandev/Specs.git pod repo update 這是使用gitcafe上的鏡像,將以上代碼中的 https://gitcafe.com/akuandev/Specs.git 替換成 http://git.oschina.net/akuandev/Specs.git 即可使用oschina上的鏡像。
如何讓自己的開源項目支持CocoaPods?
這里就介紹我寫的一個三方庫HYBMasonryAutoCellHeight
讓其支持Cocoapods
的步驟。
- 1、第一步:打開終端並進入到工程的目錄。這里是我所開源的一個
HYBMasonryAutoCellHeight
開源庫,用於自動計算cell
的高度。
cd HYBMasonryAutoCellHeight
- 2、第二步:創建一個
Podspec
文件。通過命令pod spec create
創建,
pod spec create HYBMasonryAutoCellHeight
- 3、第三步:編輯該
podspec
文件:
VI HYBMasonryAutoCellHeight.podspec
大家會看到,這自動生成的已經是一個模板了,我們需要做的就是修改相關內容,補充內容就可以滿足我們的需求了。對於更高級的使用,就需要參考官方文檔,一步步地學習使用了。 看看我所提供的第三方庫的podspec
文件的配置,去掉注釋后看一看最關鍵的配置:
Pod::Spec.new do |s| s.name = "HYBMasonryAutoCellHeight" s.version = "0.0.1" s.summary = "基於Masonry的自動計算cell的行高的擴展庫" s.homepage = "http://hybios.lianliankeji.com/cocoapods-support/" s.license = "MIT" s.author = { "huangyibiao" => "huangyibiao520@163.com" } s.platform = :ios, "6.0" s.source = { :git => "https://github.com/632840804、HYBMasonryAutoCellHeight.git", :tag => "0.0.1" } s.source_files = "HYBMasonryAutoCellHeight", "*.{h,m}" s.requires_arc = true s.dependency "Masonry", "~> 0.6"
這一步很關鍵,需要配置的東西比較多。主要是s.source
這里必須提供我們的git
路徑、指定tag
號和s.source_files
這里必須指定庫的源代碼文件。通常我們會把我們的庫放到與Demo
工程的.xcodeproj
同級,比較這里的HYBMasonryAutoCellHeight
目錄是與.xcodeproj
是同級的父級目錄,然后我們就可以更簡單的設置了。如下圖:
然后我們在設置s.source_files
時,第一個就設置為HYBMansonryAutoCellHeight
,第二個就是設置為所有的.{h,m}
類型的文件。對於比較復雜的設置,可以參考AFNetworking
中的podspec
文件。
如果我們的開源庫依賴系統庫怎么辦?
# s.framework = 'SomeFramework'// 去掉#,設置依賴的系統庫名稱 # s.frameworks = 'SomeFramework', 'AnotherFramework'//設置多個系統庫名稱 # s.library = 'iconv'// 設置只依賴一個系統的library # s.libraries = 'iconv', 'xml2' // 設置依賴多個系統的library # s.xcconfig = { 'HEADER_SEARCH_PATHS' => '$(SDKROOT)/usr/include/libxml2' }// 這里是工程配置,這樣使用者就不需要手動處理,由pod自動處理了。
如果的開源庫依賴其他第三方庫,怎么辦:
s.dependency 'JSONKit', '~> 1.4'//設置我們的開源庫依賴哪些第三方庫和依賴的版本號。
- 4、第四步:這里呢,我們設置的版本號為
0.0.1
,那么tag
號為0.0.1
,因此我們還需要新建一個tag
,名為0.0.1
,然后推到git
:
$ git commit -m "如果當前有變化,先提交到git上,再創建tag" $ git tag 0.0.1 $ git push --tags $ git push origin master
第四步可以不用。
接下來,我們需要驗證我們的配置是否正確:
- 5、當然我們還可以直接使用:
pod lib lint
來驗證所有,最后一個是設置允許警告:
pod lib lint HYBMasonryAutoCellHeight.podspec --allow-warnings
如果驗證通過,會出現這樣的提示:
-> HYBMasonryAutoCellHeight (0.0.1) HYBMasonryAutoCellHeight passed validation.
如果剛才我們的配置出錯,或者需要修改一些內容,重新再推,則可以先刪除遠程的tag 0.0.1
,然后在修改后,重復上面的第四步。下面是刪除遠程tag
命令:
git push origin :refs/tags/0.0.1
6、第五步:在驗證通過后,提交到cocoapods
。也就是通過命令pod trunk push
庫名.podspec
來推送到遠程的cocoapods
:
pod trunk push HYBMasonryAutoCellHeight.podspec --allow-warnings
如果出現警告,需要修改相關內容以去掉警告。當操作成功后,我們就可以通過pod search
命令來搜索我們的庫了。
$ pod search HYBMasonryAutoCellHeight -> HYBMasonryAutoCellHeight (0.0.1) 基於Masonry的自動計算cell的行高的擴展庫 pod 'HYBMasonryAutoCellHeight', '~> 0.0.1' - Homepage: http://hybios.lianliankeji.com/cocoapods-support/ - Source: https://github.com/632840804/HYBMasonryAutoCellHeight.git - Versions: 0.0.1 [master repo]
更詳細地使用,請參考官方文檔
這里有一篇文章,寫得相當不錯:支持pod
如何生成Cocoapods私有庫?
要讓自己的庫變成私有庫,那么我們的代碼也是需要通過git
來管理的。 這里假設我們新建了一個工程,名叫BookEffect
,然后已經push
到git
遠程服務器。
- 第一步:按照第六節一樣,創建好
podspec
文件,並將整個工程推送到git
服務器這邊。 - 第二步:這才是引入私有庫的方式。
pod 'DemoLib',:git=>"http://xxxxx.git"
(替換為真實的git地址)
具體不細說,請參考:生成私有pod
使用Cocoapods打包靜態庫
這里就不細說,不過推薦一篇文章:打包表態庫,寫得很不錯,如果需要,可以參考。
最后,感謝各位認真閱讀本篇文章,感謝您的支持。