iOS SDK開發(fā)

? ? ? ? SDK包開發(fā)是屬于組件化范疇。但是這個(gè)SDK組件是封裝起來(lái)的,只是暴露了想暴露或者該暴露的類頭文件,功能實(shí)現(xiàn)代碼只有封裝的人才能看到。SDK包的模塊功能是獨(dú)立(因?yàn)檎麄€(gè)UI界面都封裝了),無(wú)論嵌入哪種App只要傳入正確的參數(shù)就能使用,一個(gè)SDK包可以相當(dāng)于一個(gè)App程序,

? ? ? ? SDK又分靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù),但是由于蘋果的限制,開發(fā)者只能開發(fā)使用靜態(tài)庫(kù),動(dòng)態(tài)庫(kù)只能被蘋果公司開發(fā)而我們開發(fā)者只能使用蘋果公司的動(dòng)態(tài)庫(kù)(有人說(shuō)自己開發(fā)的動(dòng)態(tài)庫(kù)也能用,但是限制條件太多能不能上架也是個(gè)問(wèn)題,不如不用,靜態(tài)庫(kù)既省事也省時(shí)),例如:UIKit.framework、Fundation.framework等等、所有.dylib和.tbd結(jié)尾的庫(kù)。

? ? ? ? 所以動(dòng)態(tài)庫(kù)就不用說(shuō)了,只用研究靜態(tài)庫(kù)就行了。靜態(tài)庫(kù)又分:.framework和 .a這兩種都是比較常見的,也是比較簡(jiǎn)單容易封裝的。 .framework又是較 .a簡(jiǎn)單容易,.a打包的時(shí)候需要單獨(dú)把該暴露的頭文件抽出來(lái)放到文件夾內(nèi),而 .framework打包時(shí)已經(jīng)全部分好了,一個(gè) .framework包就能游走在各個(gè)工程之間。

不說(shuō)那么多,直接開始SDK制作

1> 新建工程

這里要選Framework,如果選擇右邊的Static Library制作出來(lái)的是.a靜態(tài)庫(kù)。 起名字時(shí)記得是 有特性的、唯一的、代表你個(gè)人或者公司的名稱,要是亂起名字雖然能與其他framework區(qū)分但是我敢保證會(huì)惡心死你自己。

2> 導(dǎo)入所有要打包的類文件和其他第三方靜態(tài)庫(kù)

? ? ? ? 正常導(dǎo)入類文件就行(copy items... 和 Add to target)。其實(shí)SDK包需要的第三方靜態(tài)庫(kù)是可以一起導(dǎo)入到里面的,但是打包這些第三方靜態(tài)庫(kù)只能在你的SDK內(nèi),外部工程不能再添加該第三方靜態(tài)庫(kù)(例如:你的SDK包需要用到支付寶支付SDK,你可以打包進(jìn)去,但是外部工程用你的SDK包時(shí)就不能再導(dǎo)入支付寶的SDK了),否則會(huì)報(bào)出沖突錯(cuò)誤。所以我建議一般不要把第三方靜態(tài)庫(kù)導(dǎo)入SDK包。

? ? ? ? 在導(dǎo)入第三方靜態(tài)庫(kù)的時(shí)候要注意,不要選擇添加到target中,如果添加進(jìn)去要去target里面把第三方靜態(tài)庫(kù)刪掉(只需導(dǎo)入,不要添加進(jìn)target)

我開發(fā)的SDK包里面就有一個(gè)只有我公司才使用的第三方靜態(tài)庫(kù),所以我可以有恃無(wú)恐的把它導(dǎo)進(jìn)我的SDK包。

3>導(dǎo)入第三方靜態(tài)庫(kù)之后再link依賴的系統(tǒng)庫(kù),并設(shè)置最低運(yùn)行系統(tǒng)

在這里添加你SDK所需要的系統(tǒng)依賴動(dòng)態(tài)庫(kù),你導(dǎo)入的第三方靜態(tài)庫(kù)也會(huì)出現(xiàn)在這里

修改前的依賴庫(kù)列表

接下來(lái)需要修改動(dòng)態(tài)庫(kù),因?yàn)閠bd是蘋果提供的新的動(dòng)態(tài)庫(kù)格式,之前都是dylib。如果不修改會(huì)報(bào)出下面的的錯(cuò)誤

動(dòng)態(tài)庫(kù)錯(cuò)誤

怎么做呢?很簡(jiǎn)單:

先把原來(lái)的.tbd刪掉,然后再次添加,這個(gè)時(shí)候選擇add other,在彈出的窗口中按快捷鍵shift + command + G 調(diào)出finder的前往窗口,輸入/usr/lib,然后添加相應(yīng)的dylib動(dòng)態(tài)庫(kù)

動(dòng)態(tài)庫(kù)修改后列表


要打包的文件和第三方靜態(tài)庫(kù)全部導(dǎo)入完成情況

4>頭文件寫法

警告:SDK包的類文件命名一定不能與外部工程的類名相同,否則會(huì)有命名沖突的錯(cuò)誤,外部工程不可控,所以SDK內(nèi)的類文件命名就要起一個(gè)特別的名字(其實(shí)加個(gè)自己獨(dú)特的前綴就好了)

每建一個(gè)SDK工程都會(huì)自帶創(chuàng)建一個(gè)工程名的頭文件,將你要暴露的頭文件寫到這個(gè)自帶頭文件里,

寫法如下:

5> 暴露頭文件

將你需要暴露的類拖入Public區(qū)域

暴露頭文件

6> 選擇的編譯方式

這是最重要的一步,這一步?jīng)Q定我們制作出來(lái)的是靜態(tài)庫(kù)還是動(dòng)態(tài)庫(kù),默認(rèn)選擇的是Dynamic Library,要手動(dòng)選擇Static Library

選擇Mach-O的編譯方式

下一步:SDK是打包給別人使用的,編譯模式也要改一下

按圖操作
按圖操作
按圖操作,改成Release

下一步:

關(guān)閉bitcode

7>編譯

command+B,真機(jī)和模擬器各編譯一次

有真機(jī)選真機(jī),mei沒真機(jī)就選Build Only Device。模擬器就隨便選一個(gè)。

編譯

真機(jī)和模擬器都編譯成功,product文件夾下的framework會(huì)變黑,沒有變也沒關(guān)系,右擊framework選擇show in finder,彈出文件夾你就能看到真機(jī)和模擬器Release狀態(tài)下的framework包了

8>合并真機(jī)和模擬器的SDK包

各個(gè)framework包內(nèi)都有一個(gè)由SDK工程名字的文件


真機(jī)
模擬器

打開終端,cd進(jìn)入product文件目錄,并輸入指令:lipo -create

lipo -create

將真機(jī)和模擬器的SDK文件拖進(jìn)終端拼接在指令后面(注意留空格)

文件拖進(jìn)拼接完后,輸入指令 -output ,然后輸入output的文件名(最好與拖入文件的文件名同名)

拼接好所有之后,按回車就會(huì)自動(dòng)合并文件,稍等一會(huì)就會(huì)生成一個(gè)同名文件

將合并后的文件替換真機(jī)和模擬器各合并前的文件,這樣就有了兩個(gè)相同的真機(jī)和模擬器都可用SDK framework包了。

9>使用

合并替換完就搞定了,得到可用的SDK包。

可用的

外部工程導(dǎo)入SDK包使用,所需的第三方靜態(tài)庫(kù)和所依賴的系統(tǒng)動(dòng)態(tài)庫(kù)全部要添加一遍,不然會(huì)報(bào)錯(cuò)。但是第三方靜態(tài)庫(kù)也不要重復(fù)添加,SDK包內(nèi)有什么第三方靜態(tài)庫(kù)最好寫文檔說(shuō)明或者告訴對(duì)方(建議一般不要把第三方靜態(tài)庫(kù)導(dǎo)入SDK包。)

導(dǎo)入頭文件:使用尖括號(hào),一個(gè)即可,可以寫的你的PCH文件內(nèi)

導(dǎo)入頭文件

其他的類、方法和屬性,暴露什么就寫什么。

10> SDK包的制作和使用基本就這樣,不難,操作多幾次熟悉就可以吹牛逼了。我的方式是我認(rèn)為是最簡(jiǎn)單最實(shí)用的制作方法,當(dāng)然還有其他的方式,比如 編譯的時(shí)候,大牛們喜歡用寫腳本的方式去編譯、合并SDK文件的時(shí)候也寫腳本去合并...但是萬(wàn)變不離其宗,最終還是生成的framework包,于是我選擇了最笨的最直接方法。

PS:動(dòng)態(tài)庫(kù)與靜態(tài)庫(kù)的制作流程基本一樣,包括頭文件的暴露等,唯一不同的是Mach-O文件的編譯形式。

1. 靜態(tài)庫(kù)

平時(shí)我們用的第三方SDK基本上都是靜態(tài)庫(kù),靜態(tài)庫(kù)的幾個(gè)特點(diǎn):

在App項(xiàng)目編譯的時(shí)候會(huì)被拷貝一份編譯到目標(biāo)程序中,相當(dāng)于將靜態(tài)庫(kù)嵌入了,所以得到的App二進(jìn)制文件會(huì)變大。

在使用的時(shí)候,需要手動(dòng)導(dǎo)入靜態(tài)庫(kù)所依賴的其他類庫(kù)。(比如說(shuō)某個(gè)SDK中使用到了CoreMotion.framework,在使用的時(shí)候需要手動(dòng)導(dǎo)入。有的SDK需要link十幾個(gè)系統(tǒng)庫(kù),這個(gè)時(shí)候非常惡心,只能一個(gè)一個(gè)手動(dòng)加,這是靜態(tài)庫(kù)一個(gè)很大的不便之處。)

導(dǎo)入靜態(tài)庫(kù)的應(yīng)用可以減少對(duì)外界的依賴,如果導(dǎo)入的是第三方動(dòng)態(tài)庫(kù),動(dòng)態(tài)庫(kù)找不到的話應(yīng)用就會(huì)崩掉,例如Linux上經(jīng)常出現(xiàn)的lib not found。

靜態(tài)庫(kù)很大的一個(gè)優(yōu)點(diǎn)是減少耦合性,因?yàn)殪o態(tài)庫(kù)中是不可以包含其他靜態(tài)庫(kù)的,使用的時(shí)候要另外導(dǎo)入它的依賴庫(kù),最大限度的保證了每一個(gè)靜態(tài)庫(kù)都是獨(dú)立的,不會(huì)重復(fù)引用。


好了,如果SDK需要加載圖片或者聲音資源該怎么做呢?如果SDK內(nèi)用到了第三方框架像:AFN、SDWebImage,外部工程也用這些框架不就沖突了?下一章應(yīng)該就是解除這些疑惑

請(qǐng)閱讀:《SDK加載bundle資源》

文章感覺挺長(zhǎng)的,很感謝看到了后面的你!

像我這種菜逼,搞SDK走了很多彎路,找了很多資料,從0到1很感謝大神們的博客文章,以下是感覺挺代表性的大神文章

www.gaoshilei.com/2016/11/17/Static%20Library/

xuanliao.gitbooks.io/ios-zaji/content/zhi_zuo_framework.html

最后編輯于
?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • (原文:How to Create a Framework for iOS 作者:Sam Davies 譯者:Mr...
    王憲嶺閱讀 5,068評(píng)論 3 23
  • 本文目標(biāo):掌握封裝及開發(fā)SDK的全部技巧 文章比較長(zhǎng),建議分模塊閱讀 內(nèi)容提要:不同場(chǎng)景下如何封裝及開發(fā)SDK ....
    Yochi閱讀 18,048評(píng)論 12 88
  • 自從前段時(shí)間離職后,因?yàn)閭€(gè)人的事情一直沒有選擇再工作,也導(dǎo)致原有的文章并沒有按時(shí)產(chǎn)出.最近個(gè)人的事情整理的也差不多...
    涅槃1992閱讀 5,587評(píng)論 18 61
  • From:郭霖 前言 目前更多開發(fā)者熱衷于應(yīng)用開發(fā),極少數(shù)的開發(fā)者才有機(jī)會(huì)從事SDK開發(fā)工作,而市面上關(guān)于SDK開...
    胡二囧閱讀 1,086評(píng)論 3 7
  • I: 通常我們會(huì)把工作與愛好的界線劃分的很清,認(rèn)為工作是為了謀生、養(yǎng)家糊口而去奔波的事情,而愛好是用于在閑暇休息時(shí)...
    圓祿閱讀 302評(píng)論 0 0

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