前言
制作本地本地POD
庫就不做過多的介紹狮含,因為本身就一個命令的事pod lib create xxxx
用pod
管理項目的時候幅狮,如果用到了圖片或者XIB
文件一般有兩種寫法:resources
或者resource_bundles
Example
spec.resources = "CXSalesmanModule/**/*.{xib,png}"
spec.resource_bundles = {
'CXSalesmanModule' => ['CXSalesmanModule/**/*.{xib,png,xcassets}']
}
先來說說區(qū)別:
- 利用
resources
屬性可以指定pod
要使用的資源文件。這些資源文件在build
時會被直接拷貝到client target
的mainBundle
里。這樣就實現(xiàn)了把圖片、音頻、NIB
等資源打包進最終應用程序的目的旬陡。但是這會導致POD
庫的資源文件和主工程里的資源文件命名沖突。
Example
主工程有一個
a.png
的圖片语婴,而pod
庫里面也有一個a.png
的圖片描孟,此時就產(chǎn)生命名沖突了。
-
resource_bundles
就是為了解決命名沖突的問題砰左,CocoaPods
在0.23.0
加入的新屬性匿醒。 -
resource_bundles
會自動生成bundle
把資源文件打包進去,resources
則不會缠导。所以我們在使用resources
的時候一般都會把資源文件提前打包到bundle
最后在添加廉羔。
建議使用
resource_bundles
方式來管理資源文件
use_frameworks
重點
OC
項目pod init
的時候一般是不使用use_frameworks!
,但是當我們用cocoapods
導入swift
框架到swift
項目和OC
項目都必須要use_frameworks!
對于Podfile
有或者沒有使use_frameworks
僻造;resources
或者resource_bundles
這兩種寫法的最后編譯之后生成的包是不一樣的憋他。
- 如果使用了
use_frameworks
編譯之后查看包,我們會發(fā)現(xiàn)POD
庫是放在mainBundle
下的Frameworks
目錄下髓削。 - 沒有使用
use_frameworks
竹挡,則不會生成Frameworks
。
pod install
編譯之后我們來看下資源文件打包到哪里了
使用spec.resources
寫法
spec.resources = ["CXSalesmanModule/**/*.{xib,png}"]
沒有使用user_frameworks
如果使用圖片或者XIB
立膛,因為資源文件是直接打包到和主工程的bundle
也就是mainBundle
此迅,所以我們依舊可以和之前的寫法一樣:
使用
self.imagView.image = [UIImage imageNamed:@"icon_mine_grade"];
// xib 這里暫未做測試
使用了user_frameworks
此時我們發(fā)現(xiàn)pod
庫里面的資源文件被打包進了主工程(即:mainBundle
)下的Frameworks->CXSalesmanModule.framework
目錄下:
所以我們使用資源文件的時候,就不能直接加載mainBundle
旧巾;我們需要找到資源文件所在的bundle
獲取bundle
的兩種方式
通過class
類型查找對應的bundle
目錄,這種在category
中不能使用忍些,雖然可以通過傳入class
的方式查找鲁猩,但是容易出錯。不建議使用
NSBundle *cbundle = [NSBundle bundleForClass:[self class]];
NSString *path = [bundle pathForResource:bundleName ofType:@"bundle"];
NSBundle *bundle = [NSBundle bundleWithPath:path];
使用
NSURL *associateBundleURL = [[NSBundle mainBundle] URLForResource:@"Frameworks" withExtension:nil];
associateBundleURL = [associateBundleURL URLByAppendingPathComponent:@"CXSalesmanModule"];
associateBundleURL = [associateBundleURL URLByAppendingPathExtension:@"framework"];
NSBundle *bundle = [NSBundle bundleWithURL:associateBundleURL];
self.imagView.image = [UIImage imageNamed:@"icon_mine_grade"
inBundle: associateBunle
compatibleWithTraitCollection:nil];
XIB
同理也是通過Bundle
去加載罢坝。
使用spec.resource_bundles
寫法
spec.resource_bundles = {
'CXSalesmanModule' => ['CXSalesmanModule/**/*.{xib,png,xcassets}']
}
沒有使用user_frameworks
此時我們發(fā)現(xiàn)pod
庫里面的資源文件是被打包進了主工程(即:mainBundle
)里面的CXSalesmanModule.bundle
內(nèi)廓握,所以我們使用的話搅窿,只需要拿到這個bundle
即可。這里也驗證了上面所說的resource_bundles
會默認生成bundle
使用
NSURL *url = [[NSBundle mainBundle] URLForResource:@"CXSalesmanModule" withExtension:@"bundle"];
NSBundle *bundle = [NSBundle bundleWithURL:url];
self.imagView.image = [UIImage imageNamed:@"icon_mine_grade"
inBundle: bundle
compatibleWithTraitCollection:nil];
使用了user_frameworks
此時我們發(fā)現(xiàn)pod
庫里面的資源文件是被打包進了主工程(即:mainBundle
)下的Frameworks->CXSalesmanModule.framework->CXSalesmanModule.bundle
目錄下:
所以我們使用資源文件的時候隙券,就不能直接加載mainBundle
男应;我們需要找到資源文件所在的CXSalesmanModule.bundle
,這里也驗證了上面所說的resource_bundles
會默認生成bundle
使用
NSURL *associateBundleURL = [[NSBundle mainBundle] URLForResource:@"Frameworks" withExtension:nil];
associateBundleURL = [associateBundleURL URLByAppendingPathComponent:@"CXSalesmanModule"];
associateBundleURL = [associateBundleURL URLByAppendingPathExtension:@"framework"];
NSBundle *associateBunle = [NSBundle bundleWithURL:associateBundleURL];
associateBundleURL = [associateBunle URLForResource:@"CXSalesmanModule" withExtension:@"bundle"];
NSBundle *bundle = [NSBundle bundleWithURL:associateBundleURL];
self.imagView.image = [UIImage imageNamed:@"icon_mine_grade"
inBundle: bundle
compatibleWithTraitCollection:nil];
XIB
同理也是通過Bundle
去加載娱仔。
總的來說沐飘,使用
pod
庫里面的資源文件,我們只需要找資源文件所在的路徑即可牲迫,如果是mainBundle
則使用方式不變耐朴,如果是其他的bundle
,我們只要獲取到bundle
就可以通過bundle
去使用盹憎。
圖片存放方式
- 直接將
png
格式的圖片拖到Assets
目錄下筛峭。 - 采用
xcassets
,將圖片都放到Images.xcassets
里面陪每,新建項目的時候默認工程會有一個Assets.xcassets
影晓。
這里的圖片是采用xcassets
來打包的,按住command
+ n
選擇Asset Catalog
即可檩禾。
一般我們都是直接把圖片放到相應的目錄下挂签,這里我要說的是resource_bundles
打包圖片使用xcassets
的注意點
注意(低于iOS10
的系統(tǒng))
對于pod
資源打包方式采用resource_bundles
并且podfile
里使用了user_framework
,如果采用.xcassets
方式打包圖片锌订,iOS9 Release
環(huán)境下圖片會加載不出來竹握。如果未使用user_framework
則可以正常展示(iOS8
暫沒有測試,以及采用resources
來打包這里本人暫未做測試有興趣的小伙伴可以去測試一波)