[Dev]通過XCode 7開發(fā)framework

一、打包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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容