最近,由于項目中使用了擴展開發(fā)。為了進行開發(fā)文件的共享,故在工程中創(chuàng)建了Framework進行開發(fā)文件的共享。結果上架失敗,才想起來,自己創(chuàng)建的framework是動態(tài)庫,包含動態(tài)庫的項目是不能上架的。過后對靜態(tài)庫和動態(tài)庫進行了一次總結。
使用.a靜態(tài)庫
1、創(chuàng)建靜態(tài)庫
- File -> Framework & Library -> Coco Touch Framework(.framework文件) Cocoa Touch Static Library(.a文件),此時創(chuàng)建.a文件
- 可以把static文件下原來的2個文件刪除,創(chuàng)建自定義的工具類Tool,在Tool中聲明且實現(xiàn)一個類方法
- 在模擬器和真機的環(huán)境下進行分別編譯(此時有一個錯誤,不用管。libstatic.a文件會變成黑色,在show in finder中把紅色的文件刪除)
- 此時Tool還不可以使用,因為沒有暴露.h頭文件。點擊項目 -> Build Phases -> Copy Files -> + -> 選中Tool.h文件,再次分別編譯
- 將生成的Debug-iphonesimulator文件拖進項目中,此時就可以使用Tool.h文件了。但還會有一個問題,新生成文件不能適用全部機型的cpu指令集
- 解決5中的問題,點擊項目 -> Build Settings -> 在Architectures中將Build Active Architecture Only中的Debug屬性值改為NO,再次分別編譯
- 將項目中的Debug-iphonesimulator文件刪除(在show in finder中也要刪除),再次導入Debug-iphonesimulator文件
2、詳解1-(5)的問題
每個機型的CPU都會有不同的架構,我們創(chuàng)建的靜態(tài)庫不能適用于全部機型的CPU架構。
使用命令查看第三方靜態(tài)庫都支持那些架構:切換至靜態(tài)庫文件夾(使用cd命令),然后輸入lipo -info 靜態(tài)庫名稱
- 在模擬器中
i386架構:iPhone模擬器 3gs -> iPhone5
x86_64架構:iPhone模擬器 5s -> 6p - 在真機中
armv7:iPhone 3gs -> 4s
armv7s:iPhone 5 -> 5c
armv64:iPhone 5s -> 6p
3、如何讓i386和x86_64可以兼容:
- 1-7中的配置,可以使編譯好后的靜態(tài)庫同時支持i386和x86_64架構
- 合并文件夾
創(chuàng)建靜態(tài)庫文件時,當模擬器是iphone5以下的時候,編譯出來的靜態(tài)庫文件支持的是i386架構。當模擬器是5s以上的時候,編譯出來的靜態(tài)庫文件支持的是x86_64文件。兩個編譯好的靜態(tài)庫文件夾的名字是相同的,為了防止后編譯生成的文件夾覆蓋先編譯的,修改第一個文件夾的名字(原文件名字后+1就行)。然后使用命令(lipo -create)合并兩個文件夾。
cd …
lipo -create Debug-iphonesimulator/libstaticLib.a Debug-iphonesimulator1/libstaticLib.a -output libstatic.a
4、在.a靜態(tài)庫中使用圖片
- 創(chuàng)建一個.bundle類型的文件夾,在該文件中放入靜態(tài)庫要使用的圖片
- 在靜態(tài)庫中,讀取該bundle文件下的圖片,使用如下代碼。
NSString *path=[[NSBundle mainBundle] pathForResource:@"papa.png" ofType:nil inDirectory:@"testimg.bundle"];
[UIImage imageWithContentsOfFile:path];
- 將靜態(tài)庫設置為所有CPU架構可用(1-6),在真機和模擬器環(huán)境下分別編譯
- 在使用靜態(tài)庫的項目中,導入Debug-iphonesimulator文件,同時也要把靜態(tài)庫中存放圖片的bundle文件也導入項目中
使用.framework靜態(tài)庫
- 注意:自己創(chuàng)建的.framework文件都是動態(tài)庫,項目中如果包含動態(tài)庫,該項目是不允許上架的。
- 如何將.framework動態(tài)庫轉換為靜態(tài)庫:
在Project中選中項目 -> Build Settings -> All -> 在右側搜索框輸入mach -> 將Mach-O Type的值改為Static Library