CocoaPods簡介
每種語言發(fā)展到一個階段,就會出現(xiàn)相應(yīng)的依賴管理工具,例如Java語言的Maven,nodejs的npm。隨著iOS開發(fā)者的增多,業(yè)界也出現(xiàn)了為iOS程序提供依賴管理的工具,它的名字叫做:CocoaPods?官網(wǎng):?http://cocoapods.org/
一、安裝
1.更新gem
如果終端gem版本太老可能會有問題,先更新gem:(現(xiàn)在大部分新機都不會有這個問題)
sudo gem update --system
2.換源
gem默認的源是外國的https://rubygems.org/,國內(nèi)網(wǎng)速太慢,換成淘寶源
gem sources -l???????????? ? ? ? ? ? ? // 查看當(dāng)前源
gem sources --remove https://rubygems.org/ ?? // 刪除原有的rubygems源
gem sources --add?https://gems.ruby-china.com
gem sources -l?// 再次查看當(dāng)前源有沒有替換成功
3.選中xcode
如果安裝有多個版本xcode的朋友,需要切換一個默認的版本
sudo xcode-select --switch /Applications/Xcode.app
4.安裝cocoapods
mac系統(tǒng)版本如果是10.11以前的,使用一下命令安裝:
sudo gem install cocoapods
如果是10.11以后由于cocoapods的命令路徑改變了,變成:
sudo gem install -n /usr/local/bin cocoapods
5.初始化cocopods
安裝好cocopods以后,需要下載更新本地的依賴庫tree,每天很多人都會更新或創(chuàng)建好的Pods庫,需要下載或更新到本地,由于依賴庫tree數(shù)量太多,可能會很慢,耐心等待,中間可能出現(xiàn)各種莫名其妙的錯誤,很大一部分是網(wǎng)絡(luò)原因,請重新執(zhí)行命令
pod setup
二、項目集成cocopods
1.進入到項目的根目錄,創(chuàng)建Podfile文件,
cd? ***/IOSHelloWorldProject??????? // 進入項目根目錄
touch Podfile????????????????????????????? // 創(chuàng)建Podfile文件
2.用記事本或xcode打開Podfile文件,添加項目所需要的依賴庫,例如:
platform :ios, '8.0'
inhibit_all_warnings!
pod 'AFNetworking'
pod 'SDWebImage'
這樣一個AFNetworking、SDWebImage的依賴庫就添加完成了
3.安裝依賴庫,返回終端執(zhí)行:
pod install --no-repo-update
pod install --verbose --no-repo-update
--verbose 查看安裝細節(jié)
4.安裝完成以后我們不在打開后綴為.xcodeproj的工程,而是打開后綴為.xcworkspace的工作空間。
此時一個簡單的cocopods工程就完成了,相信可以滿足大部分小朋友的需求了,對于項目比較復(fù)雜、架構(gòu)設(shè)計要求高、個性化追求高的小朋友請接著看cocopods的高級教程
5.cocopods升級
pod --version?? //?查看cocopods當(dāng)前的版本
gem?update cocoapod //?升級cocopods命令
6.cocopods卸載
電腦重裝或者切換到某個賬號后cocopods使用有問題或者cocopods出現(xiàn)解決不了的問題而必須卸載重裝,下面就是卸載了:
which pod // 查看pod的安裝路徑
gem list --local | grep cocoapods?? // 查看當(dāng)前安裝了哪些有關(guān)cocopods的東西
xiaomingdeMacBook-Pro:OCServiceDemo xiaoming$ gem list --local | grep cocoapods
cocoapods (1.1.1)
cocoapods-core (1.1.1)
cocoapods-deintegrate (1.0.1,1.0.0.beta.1)
cocoapods-downloader (1.1.2,1.1.1,1.0.0.beta.3,0.9.3)
cocoapods-plugins (1.0.0,1.0.0.beta.1,0.4.2)
cocoapods-search (1.0.0,1.0.0.beta.2,0.1.0)
cocoapods-stats (1.0.0,1.0.0.beta.4,0.6.2)
cocoapods-trunk (1.1.1,1.0.0,1.0.0.beta.3,0.6.4)
cocoapods-try(1.1.0,1.0.0.beta.3,0.5.1)
接下來一個一個卸載:
sudo gem uninstall cocoapods-core
sudo gem uninstall cocoapods-core
如果需要卸載那個版本,如下:
sudo gem uninstall cocoapods -v 1.1.1 //后面的版本號要和上面列表中的版本號對應(yīng)
M1芯片:
sudo arch -x86_64 gem install ffi
arch -x86_64 pod install
二、國內(nèi)鏡像下載慢的解決方案:
1.切換鏡像源
- gem sources --remove https://rubygems.org/
- gem sources -a https://gems.ruby-china.com
?2.使用國內(nèi)站點開放的鏡像源,如gitee:
pod repo remove master
pod repo add master https://gitee.com/mirrors/CocoaPods-Specs.git
?3.Podfile文件增加指向鏡像源:
? source 'https://gitee.com/mirrors/CocoaPods-Specs.git'
三、cocopods高級教程
1.類似pod 'AFNetworking'依賴庫名如何得來,使用pod的搜索命令:
pod search AFNetworking
xiaomingMacBook-Pro:OCServiceDemo xiaoming$ pod search AFNetworking
-> AFNetworking (3.1.0)
A delightful iOS and OS X networking framework.
pod 'AFNetworking', '~> 3.1.0'
- Homepage: https://github.com/AFNetworking/AFNetworking
- Source:?? https://github.com/AFNetworking/AFNetworking.git
- Versions: 3.1.0, 3.0.4, 3.0.3, 3.0.2, 3.0.1, 3.0.0, 3.0.0-beta.3, 3.0.0-beta.2, 3.0.0-beta.1, 2.6.3, 2.6.2, 2.6.1, 2.6.0, 2.5.4, 2.5.3, 2.5.2,
2.5.1, 2.5.0, 2.4.1, 2.4.0, 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]
- Subspecs:
- AFNetworking/Serialization (3.1.0)
- AFNetworking/Security (3.1.0)
- AFNetworking/Reachability (3.1.0)
- AFNetworking/NSURLSession (3.1.0)
- AFNetworking/UIKit (3.1.0)
-> 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]-> AFNetworking+Ext (1.2.1)
? AFNetworking的封裝, 并提供一個 UIImageView+DYLoading? cacheinfileSystem+memory
? pod 'AFNetworking+Ext','~> 1.2.1'- Homepage: https://github.com/junhaiyang/AFNetworkingExt- Source:? https://github.com/junhaiyang/AFNetworkingExt.git- Versions:1.2.1,1.2,1.1,1.0,0.5,0.4,0.3 [master repo]
? - Subspecs:
? ? - AFNetworking+Ext/Base (1.2.1)
? ? - AFNetworking+Ext/AFCustomRequestOperation (1.2.1)
? ? - AFNetworking+Ext/AFDownloadRequestOperation (1.2.1)
? ? - AFNetworking+Ext/AFTextResponseSerializer (1.2.1)
? ? - AFNetworking+Ext/example (1.2.1)
? ? - AFNetworking+Ext/UIKit (1.2.1)
? ? - AFNetworking+Ext/UIKit/UIImageView+DYLoading (1.2.1)
解釋下內(nèi)容:
-> AFNetworking (3.1.0)??????? // 依賴庫名、最新版本號
A delightful iOS and OS X networking framework.??? // 簡介描述
pod 'AFNetworking', '~> 3.1.0'???????????????????????????? // 在Podfile文件里引用這個依賴庫的語法,大部分情況下拷貝這行到Podfile文件即可
- Homepage: https://github.com/AFNetworking/AFNetworking?? // 依賴庫的主頁,主頁里包含介紹、說明、源碼等一系列文件
- Source:?? https://github.com/AFNetworking/AFNetworking.git?? // 依賴庫的git倉庫路徑
- Versions: 3.1.0, 3.0.4, 3.0.3, 3.0.2, 3.0.1, 3.0.0, 3.0.0-beta.3, 3.0.0-beta.2, 3.0.0-beta.1, 2.6.3, 2.6.2, 2.6.1, 2.6.0, 2.5.4, 2.5.3, 2.5.2,
2.5.1, 2.5.0, 2.4.1, 2.4.0, 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]
- Subspecs:?? // 這里的是依賴庫的各個子模塊,一般不用關(guān)心,研究依賴庫源碼框架的可以看看
- AFNetworking/Serialization (3.1.0)
- AFNetworking/Security (3.1.0)
- AFNetworking/Reachability (3.1.0)
- AFNetworking/NSURLSession (3.1.0)
- AFNetworking/UIKit (3.1.0)
在Podfile文件使用如下語法引用依賴庫:
pod 'AFNetworking'//不顯式指定依賴庫版本,表示每次都獲取最新版本pod 'AFNetworking', '2.0'//只使用2.0版本pod 'AFNetworking', '>2.0'//使用高于2.0的版本pod 'AFNetworking', '>=2.0'//使用大于或等于2.0的版本pod 'AFNetworking', '<2.0'//使用小于2.0的版本pod 'AFNetworking', '<=2.0'//使用小于或等于2.0的版本pod 'AFNetworking', '~>0.1.2'//使用大于等于0.1.2但小于0.2的版本,不包含0.1.2pod 'AFNetworking', '~>0.1'//使用大于等于0.1但小于1.0的版本pod 'AFNetworking', '~>0'//高于0的版本,寫這個限制和什么都不寫是一個效果,都表示使用最新版本
?2.多個target使用相同Pod依賴庫
如果為IOSHelloWorldProject的targetOne和targetTwo都需要引用Reachability、SBJson、AFNetworking三個Pods依賴庫,可以使用link_with關(guān)鍵字來實現(xiàn),將Podfile寫成如下方式:
link_with 'targetOne', 'targetTwo'? ?
pod'Reachability','~>3.0.0'pod'SBJson','~>4.0.0'? ?
pod 'AFNetworking','~>2.0'
新的語法是使用abstract_target
# There are no targets called"Shows"in any Xcode projects
abstract_target 'Shows'do? pod 'ShowsKit'? # Has its own copy of ShowsKit + ShowWebAuth
target 'ShowsiOS'do? ? pod 'ShowWebAuth'? end
?# Has its own copy of ShowsKit + ShowTVAuth
target 'ShowsTV'do? ? pod 'ShowTVAuth'? end
end
如果使用隱式abstract_target語法必須寫在Podfile文件頂部:
pod'ShowsKit'# Has its own copy of ShowsKit + ShowWebAuth
target 'ShowsiOS'do? pod 'ShowWebAuth'end
# Has its own copy of ShowsKit + ShowTVAuth
target 'ShowsTV'do? pod 'ShowTVAuth'end
3.不同target引用不同Pod依賴
如果為IOSHelloWorldProject的targetOne引用Reachability,而targetTow引用SBJson、AFNetworking,將Podfile寫成如下方式:
target :'targetOne' do
pod'Reachability','~>3.0.0'
end? ?
target :'targetTow' do
pod 'AFNetworking','~>2.0'
pod'SBJson','~>4.0.0'
end
do/end作為開始和結(jié)束標(biāo)識符
4.其他常用pod引用依賴庫語法
pod'Alamofire',:path=>'~/Documents/Alamofire'? ? ? // 在~/Documents/Alamofire路徑下存在spec的項目(spec后期介紹)pod'Alamofire',:git=>'https://github.com/Alamofire/Alamofire.git'? // git上的master分支pod'Alamofire',:git=>'https://github.com/Alamofire/Alamofire.git',:tag=>'3.1.1'? // git上tag為3.1.1pod'Alamofire',:git=>'https://github.com/Alamofire/Alamofire.git',:commit=>'0f506b1c45'// git上commit為0f506b1c45pod'Alamofire',:git=>'https://github.com/Alamofire/Alamofire.git',:branch=>'dev'? ? ? // git上的開發(fā)分支
更多Podfile語法請參考官網(wǎng):https://guides.cocoapods.org/syntax/podfile.html#podfile
5.關(guān)于Podfile.lock文件
在使用CocoaPods,執(zhí)行完pod install之后,會生成一個Podfile.lock文件。這個文件看起來跟我們關(guān)系不大,實際上絕對不應(yīng)該忽略它。
該文件用于保存已經(jīng)安裝的Pods依賴庫的版本
Podfile.lock文件最大得用處在于多人開發(fā)。當(dāng)團隊中的某個人執(zhí)行完pod install命令后,生成的Podfile.lock文件就記錄下了當(dāng)時最新Pods依賴庫的版本,這時團隊中的其它人check下來這份包含Podfile.lock文件的工程以后,再去執(zhí)行pod install命令時,獲取下來的Pods依賴庫的版本就和最開始用戶獲取到的版本一致。如果沒有Podfile.lock文件,后續(xù)所有用戶執(zhí)行pod install命令都會獲取最新版本的SBJson,這就有可能造成同一個團隊使用的依賴庫版本不一致,這對團隊協(xié)作來說絕對是個災(zāi)難!
在這種情況下,如果團隊想使用當(dāng)前最新版本的SBJson依賴庫,有兩種方案:
更改Podfile,使其指向最新版本的SBJson依賴庫;
執(zhí)行pod update命令;
鑒于Podfile.lock文件對團隊協(xié)作如此重要,我們需要將它添加到版本管理中
5.查看本地依賴庫的tree文件
cocopods的tree文件默認是隱藏的,先把Mac隱藏文件夾顯示出來,
Mac隱藏和顯示的命令如下:
隱藏:defaults?write?com.apple.finder?AppleShowAllFiles?-bool?true
顯示:defaults?write?com.apple.finder?AppleShowAllFiles?-bool?false
然后退出終端,重啟Finder
cocopods的tree文件的默認路勁是
~/.cocoapods/repos/master/Specs? // 當(dāng)前用戶的.cocoapods/repos/master/Specs目錄下
直接使用命令如下命令打開路勁即可:
open ~/.cocoapods/repos/master/Specs
常見問題:
1.如果pod install 出現(xiàn)報錯:
[!] Unable to find host target(s) for StaticLib. Please add the host targets for the embedded targets to the Podfile.
Certain kinds of targets require a host target. A host target is a "parent" target which embeds a "child" target. These are example types of targets that need a host target:
- Framework
- App Extension
- Watch OS 1 Extension
- Messages Extension (except when used with a Messages Application)
解決方案:
降低一個版本試下:
pod _1.1.1_ install
Xcode 9以后如果使用了cocopods后icon無法顯示,Podfile文件底部添加:
post_install?do?|installer|
copy_pods_resources_path =?"Pods/Target Support Files/Pods-FuelCardApp/Pods-FuelCardApp-resources.sh"
string_to_replace =?'--compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"'
assets_compile_with_app_icon_arguments =?'--compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${BUILD_DIR}/assetcatalog_generated_info.plist"'
text = File.read(copy_pods_resources_path)
new_contents = text.gsub(string_to_replace, assets_compile_with_app_icon_arguments)
File.open(copy_pods_resources_path,?"w") {|file| file.puts new_contents }
end