在進(jìn)行組件化或者打靜態(tài)庫時(shí),不可避免的會(huì)進(jìn)行資源文件的處理,一般有以下幾種情況:
1、pod 庫中的代碼讀取自身 pod 庫中的資源
2、pod 庫中代碼讀取其他 pod 庫資源
3、主工程讀取 pod 庫資源
4、pod 庫讀取主工程資源(這個(gè)讀取思想錯(cuò)誤)
通常在主工程調(diào)用主工程的資源時(shí),可以直接 imageName 或者 [mainbundle pathForRecource] 讀取,但是在 pod 進(jìn)行管理的時(shí)候, pod 資源文件也會(huì)變?yōu)?bundle 加入到 mainBundle 中,但是由于最直接的 bundle 并不是 mainBundle ,所以這種方法是行不通的,關(guān)鍵要取到資源相關(guān)聯(lián)的 bundle 。
一、資源文件引用的方式
CocoaPods 兩種資源文件引用方式 resource_bundles & resources
recource_bundles 允許當(dāng)前 Pod 庫的資源包的名稱和文件,key 是 bundle 的名稱,value 是需要包括文件的通配。
官方推薦使用 resource_bundles ,因?yàn)橛?key-value 可以避免相同名稱資源的名稱沖突。
建議 bundle 的名稱至少包括 pod 庫的名稱,避免同名沖突。
s.resource_bundles = {?? ? 'AClassTest' => ['AClassTest/Assets/**/*{xib,xcassets,storyboard}']? }
resources
使用 resource 來指定資源,被指定的資源只會(huì)簡單的被 copy 到目標(biāo)工程中。官方認(rèn)為用 resources 無法避免同名文件資源沖突,同時(shí) Xcode 也不會(huì)對這些資源做優(yōu)化。
s.resource = ['AClassTest/Assets/**/*{xib,xcassets,storyboard}']
二、圖片資源的管理
熟知常用的@2x @3x圖片是為了縮小用戶最終下載時(shí)的包的大小,通常會(huì)將圖片放在 .xcassets 文件中管理,新建的項(xiàng)目也默認(rèn)創(chuàng)建。
使用 .xcassets ?不僅可以方便Xcode 查看和拖入圖片,同時(shí) .xcassets ?最終打包生成為Assets.car 文件。對于 Assets.car 文件, App Slicing 會(huì)為切割留下符合目標(biāo)設(shè)備分辨率的圖片,可以縮小用戶最終下載的包的大小。
對于Pods庫的資源,同樣也可以用 .xcassets 管理。
三、實(shí)際驗(yàn)證
官方推薦 resource_bundles 的理由是 “可以解決同名沖突” 和 “Xcode 為 bundle 提供了一些優(yōu)化”。
1、使用resources
使用 resources 之后只會(huì)簡單的將資源文件 copy 到目標(biāo)工程,最后和目標(biāo)工程的圖片文件以及其他使用 resources 的 Pod 的圖片文件, 統(tǒng)一打包為了一個(gè)Assets.car。
讀取圖片的方式
UIImage *image = [UIImage imageNamed:@"arrow_down" inBundle:[NSBundle bundleForClass:[self class]] compatibleWithTraitCollection:nil];
2、使用 resource_bundles
在 pod install 后,工程目錄如下

bundle的包內(nèi)容為

此時(shí)獲取圖片的方式不同

resources 和 resource_bundles 對 .xcassets 都可以很好的支持。
3、同名文件沖突的問題
使用?resources?之后只會(huì)簡單的將資源文件 copy 到目標(biāo)工程(Example 工程),最后和目標(biāo)工程的圖片文件以及其他同樣使用?resources?的 Pod 的圖片文件,統(tǒng)一一起打包為了一個(gè)?Assets.car。
使用?resource_bundles?之后會(huì)為為指定的資源打一個(gè)?.bundle,.bundle包含一個(gè)?Assets.car,獲取圖片的時(shí)候要嚴(yán)格指定?.bundle?的位置,很好的隔離了各個(gè)庫或者一個(gè)庫下的資源包。
顯然,使用?resources,如果出現(xiàn)同名的圖片,顯然是會(huì)出現(xiàn)沖突的,同樣使用?some-image?名稱的兩個(gè)圖片資源,不一定能正確調(diào)用到。
一般來說使用 resource_bundles 更好。
demo:https://github.com/yuetianlu/PrivatePodsExample.git
參考文章: