Cocoapods,讓iOS開發(fā)更簡(jiǎn)單(三):實(shí)踐經(jīng)驗(yàn)匯總

相信各位讀了之前的兩篇文章,對(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!

解析:

  1. 如果在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
  1. 如果使用了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
  1. 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。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容