一、打包Framework
1、新建iOS->Framework & Library->Cocoa Touch Framework。
2、選擇next進(jìn)入下一步
3、在PROJECT->Deployment Target->iOS Deployment Target選擇你需要支持的最低系統(tǒng)。
同樣的操作在TARGETS中,Deployment Info->Deployment Target
4、由于我的framework需要支持iOS7,所以在第2、3步中進(jìn)行了相應(yīng)的設(shè)置。Build時會發(fā)現(xiàn)有?ld: warning: embedded dylibs/frameworks only run on iOS 8 or later警告,這是因為工程默認(rèn)編譯設(shè)置的是Dynamic Framework。這種編譯只有在iOS8以后才能使用。
5、針對第4步中所出現(xiàn)的問題,根據(jù)需求我的工程不需要使用動態(tài)framework,以使用其動態(tài)更新的功能。動態(tài)庫可以分開發(fā)布,在運(yùn)行時查找并存入內(nèi)存,但蘋果只允許他自己用,到iOS8以后才開放給開發(fā)者。因此,我需要將Dynamic Framework更換為Static Library靜態(tài)模式。設(shè)置路徑為Build Settings->Linking->Mach-O Type->Static Library
6、這里要注意,在編譯時,不要將圖片文件放在工程里面,否則編譯后framework中會出現(xiàn)大量的零散圖片文件在里面。這時需要將圖片等資源放在.bundle文件中。圖片的打包在第二步介紹。
7、這樣打包的framework依然有問題,如果你用了Category,別人在用你的framework時會發(fā)生崩潰。這時別人在引用時需要在工程中Other Linker Flags中添加-ObjC如果依然有問題,再添加-all_load。
8、終于編譯成功,但發(fā)現(xiàn)很多關(guān)于符號表的警告,這時需要將Generate Debug Symbols設(shè)置為NO即可關(guān)閉符號表警告。
9、但是我需要支持bitcode,以上設(shè)置后并不能使framework支持bitcode,因此還需要進(jìn)行額外的設(shè)置一個命令讓其支持bit code。在TAGETS的Build setting中搜索Other C Flags,添加命令“-fembed-bitcode”。同樣的設(shè)置在PROJECT中。如果不進(jìn)行以上操作。別人在集成你的framework時可以編譯,亦可以真機(jī)測試。唯獨(dú)在打包時會發(fā)出警告并打包失敗。警告為framework不支持bitcode!
10、無論SDK還是Framework都需要暴露公共的頭文件以供使用者讀取和。在TARGETS->Build Phases->Headers里面,有三種類別。Public(公共的),這里存放供其他人查看的header。Private(私有的)這里存放私有的Header,以上兩個Headers存放位置都會暴露出來,所有人可以查看。有些Header是不想給別人看到的。這種header放在第三個類Project中。
11、打包。Edit Scheme->Build Configuration->選為Release然后Run即可.
二、打包bundle文件
1、新建OS X->Framework & Library->Bundle新建
2、在Build Settings->(null)-Deployment->iOS Deployment Target->選擇自己需要支持的最低系統(tǒng)。
3、build后會生成一個bundle包,但在包中的圖片由以前的png格式全部變成tiff格式。為了防止這種格式轉(zhuǎn)變。需要在Build Settings->Architectures->Base SDK->選擇iOS的SDK要支持的版本。這時TARGETS中Build Setting->User-Defined中會出現(xiàn)一個新的Key:COMBINE_HIDPI_DEBUG_INFO,把它設(shè)置為NO。
4、這樣創(chuàng)建的圖片資源不能使用[UIImage imageNamed:@“png”]來獲取了。需要使用路徑方式來讀取圖片。
這里我使用了一個函數(shù)來獲取路徑。
NSString *getKaYiKaImageBundlePath(NSString *filename);
NSString *getKaYiKaImageBundlePath(NSString *filename) {
NSBundle *libBundle = [NSBundle bundleWithPath:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"KaYiKa.bundle"]];
if (libBundle && filename) {
NSString *path = [[libBundle resourcePath] stringByAppendingPathComponent:filename];
path = [path stringByAppendingString:@".png"];
return path;
}
return nil;
}
使用時直接用
[UIImage imageWithContentsOfFile:getKaYiKaImageBundlePath(@"tool_return_day")]獲取圖片。
三、創(chuàng)建引用工程
創(chuàng)建引用工程時將framework和bundle同時導(dǎo)入。
剩下的使用與系統(tǒng)framework相同。
## 參考文獻(xiàn)
1. http://blog.lanvige.com/2015/01/04/library-vs-framework-in-ios/?utm_source=tuicool&utm_medium=referral
2. http://www.itdecent.cn/p/a8366426fe51