相信各位讀了之前的兩篇文章,對(duì)pods的使用已經(jīng)相當(dāng)熟練了。不過(guò)在紛繁復(fù)雜的實(shí)際使用場(chǎng)景下,可能還是會(huì)遇到一些問(wèn)題。本文就結(jié)合自己的實(shí)踐經(jīng)驗(yàn),做一些快問(wèn)快答,希望大家能多多補(bǔ)充交流。話不多說(shuō),那我們就即刻開始吧!
pod系列文章
Cocoapods,讓iOS開發(fā)更簡(jiǎn)單(一):走近Cocoapods
Cocoapods,讓iOS開發(fā)更簡(jiǎn)單(二):創(chuàng)建私有庫(kù)
Cocoapods,讓iOS開發(fā)更簡(jiǎn)單(三):實(shí)踐經(jīng)驗(yàn)匯總
一文帶你快速分清靜態(tài)庫(kù)-動(dòng)態(tài)庫(kù)-Framework
pods版本
//查看安裝的pods版本
pod --version
//更新pods版本
sudo gem install cocoapods
清除本地緩存
//查看本地緩存列表
pod cache list
//清除本地緩存
pod cache clean XXX
靈活多樣的版本依賴形式
~> 含義為:大于等于指定的版本號(hào),小于高一位的版本號(hào)
eg:
~> 0.1.x :0.2以下 0.1.x以上(包括0.1.x)
pod 'AFNetworking' //不顯式指定依賴庫(kù)版本,表示每次都獲取最新版本
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的版本
pod 'AFNetworking', '~>0.1' //使用大于等于0.1但小于1.0的版本
pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :branch => 'dev'//指定遠(yuǎn)程分支
pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :tag => '0.7.0'//指定tag
pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :commit => '082f8319af'//指定commit
pod 'PodTestLibrary', :path => '../../../PodTestLibrary'//指定本地地址
pod 'AFNetworking', '2.0' , :modular_headers => true//設(shè)置個(gè)別庫(kù)的modular_headers
子庫(kù)的依賴
pod 'TestPodLib/aaa','0.1.0'
pod 'TestPodLib', '0.1.0', :subspecs => ['aaa','bbb','ccc']
依賴的穩(wěn)定性
一般推薦使用指定版本或范圍版本號(hào),以確保依賴的穩(wěn)定性。
pod install&pod update
- pod install:在第一次檢索集成第三方以及每一次在Podfile中新增、更改或刪除pod的時(shí)候使用。每一次執(zhí)行pod install命令,它都會(huì)下載安裝新的pod,并且會(huì)把每一個(gè)安裝的pod的版本信息寫入Podfile.lock文件。每一次執(zhí)行pod install命令,對(duì)于已在Podfile.lock中列出的pod,會(huì)下載指定的版本,不會(huì)檢查是否有新版本,而沒有在Podfile.lock中列出的pod,它會(huì)搜索并安裝Podfile中指定的版本。
- pod update:會(huì)檢查安裝Podfile中列出的所有pod的新版本(往往比較慢)。
- pod update PODNAME:將PODNAME更新到Podfile中指定的版本,可以是更新到老版本也可以是更新到新版本,取決于Podfile,而不考慮Podfile.lock中記錄的版本信息。
總結(jié):能用pod install解決問(wèn)題的,就不要用pod update。因?yàn)閜od update會(huì)把依賴庫(kù)全部檢查一遍,不僅慢有時(shí)候還會(huì)出現(xiàn)坑。
inhibit_all_warnings!
忽略Pods警告,有些第三方Pod集成進(jìn)來(lái)會(huì)有一大堆警告信息,在Podfile中對(duì)應(yīng)的target或分組下加上關(guān)鍵字inhibit_all_warnings!就可以把警告忽略。
use_frameworks!
作用:
在pods中用frameworks替代.a靜態(tài)庫(kù)。
場(chǎng)景:
swift項(xiàng)目pods默認(rèn)開啟(use_frameworks!),OC項(xiàng)目pods默認(rèn)關(guān)閉(#use_frameworks!),同時(shí)需滿足以下兩點(diǎn),
- 用pods導(dǎo)入swift框架到swift項(xiàng)目或OC項(xiàng)目都必須要use_frameworks!
- 使用dynamic frameworks,必須要在Podfile文件中添加use_frameworks!
解析:
- 如果在Podfile文件里不使用 use_frameworks! 則會(huì)生成相應(yīng)的 .a文件(靜態(tài)鏈接庫(kù)),通過(guò) static libraries 這個(gè)方式來(lái)管理pods的代碼。Linked:libPods-xxx.a包含了其它用pods導(dǎo)入的第三方框架的.a文件。
#use_frameworks! -> static libraries 方式 -> .a
- 如果使用了use_frameworks! 則pods 會(huì)生成相應(yīng)的 .frameworks文件(動(dòng)態(tài)鏈接庫(kù):頭文件 + 動(dòng)態(tài)鏈接庫(kù) + 資源文件),使用 dynamic frameworks 來(lái)取代 static libraries 方式。Linked:Pods_xxx.framework包含了其它用pods導(dǎo)入的第三方框架的.framework文件。
use_frameworks! -> dynamic frameworks 方式 -> .framework
- swift不支持.a靜態(tài)庫(kù)
use-modular-headers
swift工程依賴了OC工程的話,需要use_modular_headers!
示例:
為某個(gè) Pods 使用模塊化標(biāo)頭,可以使用以下語(yǔ)法:
pod 'TestPodLib', :modular_headers => true
另外,當(dāng)全局使用 use_modular_headers! 屬性時(shí),同時(shí)還可以使用以下方法從模塊化標(biāo)頭中排除特定的Pod:
pod 'TestPodLib', :modular_headers => false
在podspec文件中指定支持的架構(gòu)
valid_archs = ['armv7s','arm64']
s.xcconfig = {
'VALID_ARCHS' => valid_archs.join(' '),
}
s.pod_target_xcconfig = {
'ARCHS[sdk=iphonesimulator*]' => '$(ARCHS_STANDARD_64_BIT)'
}
版本號(hào)規(guī)范
版本格式:主版本號(hào).次版本號(hào).修訂號(hào),版本號(hào)遞增規(guī)則如下:
主版本號(hào):當(dāng)你做了不兼容的 API 修改,
次版本號(hào):當(dāng)你做了向下兼容的功能性新增,
修訂號(hào):當(dāng)你做了向下兼容的問(wèn)題修正。
如何使用pod中素材
常用的方式調(diào)用pod中的素材是不生效的,因?yàn)槟J(rèn)是從mainBundle中讀取的,如
imgView.image = [UIImage imageNamed:@"t.png"];
打在pod中的素材已經(jīng)不在mainBundle中而在對(duì)應(yīng)組件下的bundle 里面,所以應(yīng)該這么調(diào)用:
NSBundle *currentBundle = [NSBundle bundleForClass:[self class]];
NSString *path = [currentBundle pathForResource:@"t.png" ofType:nil inDirectory:@"resource.bundle"];
imgView.image = [UIImage imageWithContentsOfFile:path];
引用第三方庫(kù)中的頭文件
在用CocoaPods集成第三方庫(kù)之后,默認(rèn)情況下,使用類似#import <XXX/YYY.h>的方式引入第三方庫(kù)的頭文件。
pod search 經(jīng)常搜索不到的問(wèn)題
pod search只會(huì)搜索本地緩存的庫(kù),如果想搜索到最新的第三方框架或者某個(gè)框架的最新版本,必須先使用pod repo update。