iOS SDK 靜態(tài)庫(kù).framework打包流程及注意事項(xiàng)

????由于公司需求,第一次接觸靜態(tài)庫(kù)制作和打包。不懂就查,看了很多別人的寫(xiě)的文章,都是大概的幾個(gè)步驟,然后再附一個(gè)簡(jiǎn)單的demo實(shí)現(xiàn)。看完感覺(jué)有點(diǎn)也不難,但是實(shí)際操作的時(shí)候,就容易想很多,比如pch文件怎么弄?資源文件怎么搞?依賴三方怎么辦?

? ? 于是硬著頭皮開(kāi)始嘗試,踩著別人的方法慢慢摸索。索性也還好,沒(méi)多久就搞出來(lái)了,想了很久,還是準(zhǔn)備寫(xiě)一下這個(gè)流程,讓自己加深下記憶,也給有需要的人提供一點(diǎn)點(diǎn)幫助。我就不講什么靜態(tài)庫(kù)動(dòng)態(tài)庫(kù)的區(qū)別啥的,網(wǎng)上一搜一大堆,我直接開(kāi)始進(jìn)入正題。

1.整理你需要打包的代碼

? ? (1).整理圖片資源。圖片資源需要整理出來(lái),打成一個(gè).bundle包(如何打自行百度,我這里直接修改文件夾后綴即可),然后在用圖片獲取imageWithName:這種方法時(shí),不能直接寫(xiě)一個(gè)圖片的名稱,而是需要根據(jù)拼出圖片的完整路徑,并且在原來(lái)項(xiàng)目中,系統(tǒng)會(huì)自動(dòng)去讀取2x和3x的圖片,但在這里需要自己做一下處理。實(shí)現(xiàn)原理自己去百度吧,我這里直接貼代碼,需要自取。

+ (UIImage*)getImageWithName:(NSString*)imageName

{

? ? NSString*imageStr =@"";

? ? CGFloat scale = [UIScreen mainScreen].scale;

? ? if(ABS(scale -3) <=0.001) {//返回3x圖

? ? ? ? imageStr = [NSStringstringWithFormat:@"%@@3x",imageName];

? ? }else{//返回2x圖

? ? ? ? imageStr = [NSStringstringWithFormat:@"%@@2x",imageName];

? ? }

? ? NSString *bundleStr = [[NSBundle mainBundle] pathForResource:@"xxxxxx" ofType:@"bundle"]; //其中xxxxxx為你之前打的bundle包的名字

? ? NSString *imagePath = [[NSBundle bundleWithPath:bundleStr] pathForResource:imageStr ofType:@"png"];

? ? return[UIImageimageNamed:imagePath];

}

? ? (2).準(zhǔn)備需要打包的代碼。由于我的需求是把已有的功能從舊項(xiàng)目中剝離開(kāi)來(lái)打包成靜態(tài)庫(kù)即可,所以不需要從頭開(kāi)始寫(xiě),但是由于一些代碼耦合的原因,并且借鑒了一些大佬封裝SDK的思想,我還是打算給予現(xiàn)有的代碼,重新進(jìn)行構(gòu)思。這里推薦一篇大神的文章:iOS SDK開(kāi)發(fā)經(jīng)驗(yàn)分享 - 簡(jiǎn)書(shū),這里很好的提供了SDK的制作的思想,反正我看了收獲還是不少的。準(zhǔn)備好代碼,那么我們就可以進(jìn)行打包靜態(tài)庫(kù)了。接下去的步驟就比較常規(guī)。

2.靜態(tài)庫(kù).Framework 打包

? ? (1)新建一個(gè)framework工程

創(chuàng)建framework工程

(2)在BbuildSettings中,設(shè)置成靜態(tài)庫(kù),添加armv7s架構(gòu);在General中設(shè)置最低支持版本;

設(shè)置基本參數(shù)


添加armv7s
設(shè)置SDK最低支持版本

(3).導(dǎo)入已經(jīng)寫(xiě)好的代碼(包括.pch文件),注意這里圖片資源.bundle不要導(dǎo)入,另外,如果是你依賴的三方是拖入項(xiàng)目中的,例如AFNetworking,需要先從項(xiàng)目中Remove References,然后再添加,添加時(shí) Add to targets 的選項(xiàng)把勾去掉。這樣就不會(huì)把三方打包到靜態(tài)庫(kù)中,避免其他人在使用SDK的時(shí)候產(chǎn)生沖突。但是這樣的前提是需要對(duì)方在使用SDK的時(shí)候主動(dòng)添加這個(gè)SDK所需要的三方庫(kù)。

不要添加

(4).設(shè)置header,把你想暴露的.h文件放到public中,這里要提到一下,在工程一開(kāi)始創(chuàng)建的時(shí)候,系統(tǒng)會(huì)自動(dòng)生產(chǎn)一個(gè).h文件和.m文件,有些文章說(shuō)要把暴露的頭文件引入到系統(tǒng)生產(chǎn)的.h文件中,然乎在把這個(gè)頭文件添加到public中。我個(gè)人覺(jué)得如果頭文件多,那么可以這么操作,如果頭文件少的話,也沒(méi)必要這么操作,直接刪除都是沒(méi)有問(wèn)題的。


設(shè)置公開(kāi)的.h文件

? ? (5).開(kāi)始打包,選擇真機(jī)和模擬器各打一次Release包。注意:真機(jī)的包target選擇Generic iOS Device,不能連著自己的真機(jī)打包,否則打出來(lái)的framework不能支持全機(jī)型。模擬器打包則可以選擇任意機(jī)型。


打包注意

? ? (6).合成最終的.framework。在Products中找到.framework,然后show in finder 找到剛才打打Release版本的真機(jī)和模擬器包。然后新建一個(gè)文件夾,在終端中cd到該文件夾下,然后執(zhí)行l(wèi)ipo -create 模擬器framework的路徑 真機(jī)framework的路徑 output xxxx(framework的名字,和之前的工程名字相同),這樣就能在剛剛新建文件夾中找到合成的xxxx。然乎用這個(gè)xxxx文件替換真機(jī)framework里面的同樣名字為xxxx的文件,那這個(gè)真機(jī)的.framework就是最終的靜態(tài)庫(kù)。我們可以在終端中l(wèi)ipo -info 查看合成的xxxx文件,看是否支持armv7 armv7s i386 x86_64 arm64 這五項(xiàng)。


系統(tǒng)生產(chǎn)的framework


合成framework

(7)復(fù)制一份替換了文件的真機(jī).framework,并把之前圖片的.bundle放在統(tǒng)一文件夾下,這樣靜態(tài)庫(kù)就打包好了,可以給在別的項(xiàng)目或者提供給別人使用了。


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

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

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