最近,由于項(xiàng)目中使用了擴(kuò)展開(kāi)發(fā)纺涤。為了進(jìn)行開(kāi)發(fā)文件的共享译暂,故在工程中創(chuàng)建了Framework進(jìn)行開(kāi)發(fā)文件的共享。結(jié)果上架失敗撩炊,才想起來(lái)外永,自己創(chuàng)建的framework是動(dòng)態(tài)庫(kù),包含動(dòng)態(tài)庫(kù)的項(xiàng)目是不能上架的拧咳。過(guò)后對(duì)靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)進(jìn)行了一次總結(jié)伯顶。
使用.a靜態(tài)庫(kù)
1、創(chuàng)建靜態(tài)庫(kù)
- File -> Framework & Library -> Coco Touch Framework(.framework文件) Cocoa Touch Static Library(.a文件)骆膝,此時(shí)創(chuàng)建.a文件
- 可以把static文件下原來(lái)的2個(gè)文件刪除砾淌,創(chuàng)建自定義的工具類(lèi)Tool,在Tool中聲明且實(shí)現(xiàn)一個(gè)類(lèi)方法
- 在模擬器和真機(jī)的環(huán)境下進(jìn)行分別編譯(此時(shí)有一個(gè)錯(cuò)誤谭网,不用管汪厨。libstatic.a文件會(huì)變成黑色,在show in finder中把紅色的文件刪除)
- 此時(shí)Tool還不可以使用愉择,因?yàn)闆](méi)有暴露.h頭文件劫乱。點(diǎn)擊項(xiàng)目 -> Build Phases -> Copy Files -> + -> 選中Tool.h文件,再次分別編譯
- 將生成的Debug-iphonesimulator文件拖進(jìn)項(xiàng)目中锥涕,此時(shí)就可以使用Tool.h文件了衷戈。但還會(huì)有一個(gè)問(wèn)題,新生成文件不能適用全部機(jī)型的cpu指令集
- 解決5中的問(wèn)題层坠,點(diǎn)擊項(xiàng)目 -> Build Settings -> 在Architectures中將Build Active Architecture Only中的Debug屬性值改為NO殖妇,再次分別編譯
- 將項(xiàng)目中的Debug-iphonesimulator文件刪除(在show in finder中也要?jiǎng)h除),再次導(dǎo)入Debug-iphonesimulator文件
2破花、詳解1-(5)的問(wèn)題
每個(gè)機(jī)型的CPU都會(huì)有不同的架構(gòu)谦趣,我們創(chuàng)建的靜態(tài)庫(kù)不能適用于全部機(jī)型的CPU架構(gòu)疲吸。
使用命令查看第三方靜態(tài)庫(kù)都支持那些架構(gòu):切換至靜態(tài)庫(kù)文件夾(使用cd命令),然后輸入lipo -info 靜態(tài)庫(kù)名稱(chēng)
- 在模擬器中
i386架構(gòu):iPhone模擬器 3gs -> iPhone5
x86_64架構(gòu):iPhone模擬器 5s -> 6p - 在真機(jī)中
armv7:iPhone 3gs -> 4s
armv7s:iPhone 5 -> 5c
armv64:iPhone 5s -> 6p
3前鹅、如何讓i386和x86_64可以兼容:
- 1-7中的配置摘悴,可以使編譯好后的靜態(tài)庫(kù)同時(shí)支持i386和x86_64架構(gòu)
- 合并文件夾
創(chuàng)建靜態(tài)庫(kù)文件時(shí),當(dāng)模擬器是iphone5以下的時(shí)候舰绘,編譯出來(lái)的靜態(tài)庫(kù)文件支持的是i386架構(gòu)蹂喻。當(dāng)模擬器是5s以上的時(shí)候,編譯出來(lái)的靜態(tài)庫(kù)文件支持的是x86_64文件捂寿。兩個(gè)編譯好的靜態(tài)庫(kù)文件夾的名字是相同的口四,為了防止后編譯生成的文件夾覆蓋先編譯的,修改第一個(gè)文件夾的名字(原文件名字后+1就行)秦陋。然后使用命令(lipo -create)合并兩個(gè)文件夾窃祝。
cd …
lipo -create Debug-iphonesimulator/libstaticLib.a Debug-iphonesimulator1/libstaticLib.a -output libstatic.a
4、在.a靜態(tài)庫(kù)中使用圖片
- 創(chuàng)建一個(gè).bundle類(lèi)型的文件夾踱侣,在該文件中放入靜態(tài)庫(kù)要使用的圖片
- 在靜態(tài)庫(kù)中粪小,讀取該bundle文件下的圖片,使用如下代碼抡句。
NSString *path=[[NSBundle mainBundle] pathForResource:@"papa.png" ofType:nil inDirectory:@"testimg.bundle"];
[UIImage imageWithContentsOfFile:path];
- 將靜態(tài)庫(kù)設(shè)置為所有CPU架構(gòu)可用(1-6)探膊,在真機(jī)和模擬器環(huán)境下分別編譯
- 在使用靜態(tài)庫(kù)的項(xiàng)目中,導(dǎo)入Debug-iphonesimulator文件待榔,同時(shí)也要把靜態(tài)庫(kù)中存放圖片的bundle文件也導(dǎo)入項(xiàng)目中
使用.framework靜態(tài)庫(kù)
- 注意:自己創(chuàng)建的.framework文件都是動(dòng)態(tài)庫(kù)逞壁,項(xiàng)目中如果包含動(dòng)態(tài)庫(kù),該項(xiàng)目是不允許上架的锐锣。
- 如何將.framework動(dòng)態(tài)庫(kù)轉(zhuǎn)換為靜態(tài)庫(kù):
在Project中選中項(xiàng)目 -> Build Settings -> All -> 在右側(cè)搜索框輸入mach -> 將Mach-O Type的值改為Static Library