參考博客:
http://m.itdecent.cn/p/be31100f7a19
https://blog.csdn.net/baidu_34159638/article/details/52289229
SDK開發(fā)注意點: http://m.itdecent.cn/p/a3ff1d5bd761
一、新建工程



二、工程配置
點擊目標(biāo)工程 >> 選擇你創(chuàng)建的Framework >> 點擊工程設(shè)置 >> 做出如下修改
General >> Deployment Info
將SDK支持的系統(tǒng)和平臺改為自己需要的。選擇工程文件>>target第一項>>Build Setting>>搜索linking,然后幾個需要設(shè)置的選項都顯現(xiàn)出來,首先是Dead Code Stripping設(shè)置為NO,網(wǎng)上對此項的解釋如下,大致意思是如果開啟此項就會對代碼中的”dead”、”unreachable”的代碼過濾,不過這個開關(guān)是否關(guān)閉,似乎沒有多大影響,不過為了完整還原framework中的代碼,將此項關(guān)閉也未曾不可。
然后將Link With Standard Libraries關(guān)閉,我想可能是為了避免重復(fù)鏈接Build Settings >>Build Active Architecture Only設(shè)置為NO。 如果設(shè)為YES,會導(dǎo)致其編譯時只生成當(dāng)前機器的框架;將其設(shè)置為NO后,發(fā)現(xiàn)用模擬器編譯后生成的framework同時包含x86_64和i386架構(gòu)。
Build Settings -> Excluded Architectures里按照這樣設(shè)置一下。因為xcode12生成的模擬器版本靜態(tài)庫會多包含一個arm64架構(gòu),這樣會妨礙后面模擬器版本和真機版本合并,這樣設(shè)置就可讓模擬器版本沒有arm64架構(gòu)。

- Build Settings >> Mach-O Type >> Static Library
對于Mach-O Type有兩種情況:(1)選擇 Static Library 打出來的是靜態(tài)庫;(2)選擇 Relocatable Object File 打出來是動態(tài)庫。
設(shè)置為靜態(tài)庫

三、資源文件的管理
開發(fā)SDK我們使用圖片 gif 資源文件等文件時,要放在bundle文件里存放,新建bundle文件很簡單,創(chuàng)建一個文件夾,將后綴名改為.bundle就可以了。
我創(chuàng)建了一個名為XLXADResource.bundle的文件,將圖片等文件都放在這里使用。

如何使用bundle文件里的文件呢?
加載圖片
UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"XLXADResource.bundle/%@", name]]
獲取文件先找到真實路勁,然后轉(zhuǎn)化為data,再轉(zhuǎn)為其他格式
NSString * bundlePath = [[NSBundle mainBundle] pathForResource:bundleName ofType:@"bundle"];
NSBundle * bundle = [NSBundle bundleWithPath:bundlePath];
NSString * filePath = [bundle pathForResource:fileName ofType:fileType];
NSData *data = [NSData dataWithContentsOfFile:filePath];
if ([fileType isEqualToString:@"png"] || [fileType isEqualToString:@"jpg"]) {
UIImage *image = [UIImage imageWithData:data];
}
四、添加打包需要的文件
把需要打包的文件拖到工程中來,所有全局變量,宏,文件需要帶前綴,分類的方法,屬性都需要帶前綴,防止沖突。
我的SDK用了三個文件夾,分別是
libs : 存放依賴的第三方
SDK :我自己寫的代碼,包括界面,分類,宏
XLXADResource.bundle :存放圖片 gif等資源文件

如何處理依賴的第三方?
開發(fā)SDK中難免需要用到其他的第三方,如果將第三方文件打包到SDK里,萬一其他項目在集成我們SDK,項目里已經(jīng)有相同的第三方,那么就會導(dǎo)致沖突。這種情況我們需要處理。
盡量不要將第三方庫打包進 SDK,如果要打包,最好也要將該第三方庫所有文件和分類方法、屬性重命名,以避免沖突。
方法一:將SDK和依賴的第三方分離
將第三方拖到工程后,不要選擇Add to targets,這樣打包出來的framework就不會包含這些第三方文件。

那別人在集成我們的SDK時,就需要再集成一下我們所依賴的第三方,這樣才能運行。
方法二:修改第三方的所有文件類名
如果第三方文件較少,那完全可以將所有的文件名修改名字,通常第三方都有固定的前綴,將所有前綴替換就可以了。這樣的操作需要謹慎,最好提前備份好代碼,防止替換后出現(xiàn)錯誤。
五、暴露頭文件
在target >> Build Phase >> Headers里將需要暴露的頭文件從project欄拖到public欄里

六、開始打包
快捷鍵shift + command + ,選擇運行模式(debug 或 Release)分別在真機和模擬器下common + B 編譯生成對應(yīng)的Framework庫,在Products里可以得到四個framework


查看靜態(tài)庫支持的架構(gòu)
打包出來的SDK,可以用終端命令 lipo -info + 靜態(tài)庫路徑查看它所支持的架構(gòu)


模擬器版本的支持 x86_64 和 i386架構(gòu) ,如果這里還有一個arm64架構(gòu)說明在第二步工程配置里 Excluded Architectures 沒有配置好

真機版靜態(tài)庫支持arm64和 armv7架構(gòu)。
模擬器和真機靜態(tài)庫合并
終端使用命令 lipo -create + 真機靜態(tài)庫路徑 + 模擬器靜態(tài)庫路徑 + -output + 合成后文件的輸出路徑(直接使用模擬器或者真機的SDK的路徑即可,不用再創(chuàng)建新的文件夾)

再次查詢合并后的靜態(tài)庫支持架構(gòu),已經(jīng)是支持armv7 i386 x86_64 arm64所有架構(gòu)了。

至此,framework已經(jīng)打包完成,可自行決定是將模擬器版本還是真機版本還是合并版本提供給別人。
七、集成使用SDK
- 加入SDK
打包出來的SDK,可以看到里面有這幾個文件,將SDK拖到工程中

注意bundle文件要單獨,再拖到工程里,(不需要再勾選copy items if needed)否則圖片加載不出來

如果SDK依賴于其他第三方,需要先安裝依賴的第三方。
-
如果SDK內(nèi)使用了分類,那么其他項目在接入這個SDK時,要在build settings里為Other Linker Flags 添加 -ObjC
image.png
