iOS開發(fā):靜態(tài)SDK開發(fā),非常詳細

公司由于業(yè)務需求豺撑,為減少下游供應商的開發(fā)成本烈疚,縮短開發(fā)周期,特此開發(fā)SDK聪轿,然后編寫SDK使用文檔爷肝,直接讓下游供應商接入即可。SDK只暴露頭文件給接入者陆错,他們并不能看到.m文件里是如何實現(xiàn)的灯抛,這樣就可以快速的把公司的需求和產品直接快速的傳達到下游供應商,利于公司的推廣和下游供應商的使用音瓷。

什么是SDK:

軟件開發(fā)工具包(縮寫:SDK对嚼,英語全稱:Software Development Kit),一般都是一些軟件工程師為特定的軟件包、軟件框架绳慎、硬件平臺纵竖、操作系統(tǒng)等建立應用軟件時的開發(fā)工具的集合。

在OC的開發(fā)中杏愤,我們涉及到的一般是靜態(tài)庫(.a)或者動態(tài)庫(.framework)靡砌。(注:不是所有的.framework就一定是動態(tài)庫)

靜態(tài)庫與動態(tài)庫的區(qū)別?

靜態(tài)庫:鏈接時完整地拷貝至可執(zhí)行文件中声邦,被多次使用就有多份冗余拷貝乏奥。表現(xiàn)形式為?.a和.framework。動態(tài)庫:鏈接時不復制亥曹,程序運行時由系統(tǒng)動態(tài)加載到內存邓了,供程序調用,系統(tǒng)只加載一次媳瞪,多個程序共用骗炉,節(jié)省內存。 表現(xiàn)形式為?.dylib和.framework蛇受。注意:動態(tài)庫只能蘋果使用句葵,如果項目中使用了動態(tài)庫不允許上架(如:jspatch)

a與.framework有什么區(qū)別?

.a是一個純二進制文件兢仰,.framework中除了有二進制文件之外還有資源文件乍丈。 .a文件不能直接使用,至少要有.h文件配合(微信的SDK就是這種形式)把将,.framework文件可以直接使用轻专。 .a + .h + sourceFile = .framework。 建議用.framework察蹲。再者?靜態(tài)方式開發(fā)请垛,一直是iOS SDK開發(fā)的主流方式

靜態(tài)庫與動態(tài)庫的區(qū)別催训?和?a與.framework有什么區(qū)別?參考的是:iOS SDK開發(fā)(入門指南) - 掘金宗收,然后本人稍加了改動漫拭。

創(chuàng)建靜態(tài)庫工程

本人是用Xcode 10.2.1 創(chuàng)建,是以.framework形式開發(fā)靜態(tài)庫的混稽。

選擇創(chuàng)建.framework靜態(tài)庫項目,語言選擇Objective-C采驻。雖然現(xiàn)在swift已經到5.0了,但是大家作為開發(fā)者荚坞,都是從OC開始的挑宠,所以用OC,受眾面廣颓影,大家都會各淀,用起來方便。

創(chuàng)建靜態(tài)庫
靜態(tài)庫工程命名

以上倆個圖片步驟就是創(chuàng)建靜態(tài)庫诡挂。

靜態(tài)庫配置

TARGETS-General-Deployment Info碎浇,設置支持iOS系統(tǒng)的最低版本和支持的設備

配置SDK使用的設備和支持的最低iOS版本。

TARGETS-Build Settings-Linking 璃俗,選擇 Static Library(靜態(tài)庫)奴璃,系統(tǒng)默認的是Dynamic Library(動態(tài)庫)。這個一定要記得改城豁,切記一定要改苟穆,否則你創(chuàng)建的就不是靜態(tài)庫

選擇修改配置為靜態(tài)庫

TARGETS-Build Settings-Build Options,將 Enable Bitcode修改為No.

將 Enable Bitcode修改為No.

Edit Scheme - Run - Info - Build Configuration 修改為Release

修改運行環(huán)境為Release


在SDK項目中創(chuàng)建Bundle

個人以為有以下倆中方法:

1:在桌面上創(chuàng)建一個空的文件夾唱星,然后文件名稱修改為.bundle結尾雳旅,那么系統(tǒng)就把這個文件轉變成bundle文件,然后拖入你的SDK項目中间聊。(本人親自測試攒盈,可以的)

2:選中Xcode項目,然后選擇左上角的 File-New-Target-macOS-Bundle

選擇創(chuàng)建Bundle的路徑
選擇Bundle創(chuàng)建
Bundle命名

然后做如下配置:

TARGETS-TestBundle(你的bundle名稱)-Build Settings -Architectures-Base SDK 設置為iOS

設置bundle為iOS

這里在SDK工程中創(chuàng)建bundle后哎榴,在General-Signing可能會報錯型豁,例如:

創(chuàng)建bundle后報錯

解決方法是:把 Automatically manage signing 前面的??去掉,然后在重新打上??尚蝌,彈框選擇Enable Automatic ,然后在 team 一欄在選擇一個開發(fā)者賬號即可迎变。

選擇一個開發(fā)者賬號

TARGETS-TestBundle-General-Deployment Info:修改 所支持的iOS版本和設備

修改所支持的iOS按版本和設備

TARGETS-TestBundle-Build Settings-Build Options:修改 Enable Bitcode為NO

修改 Enable Bitcode為NO

TARGETS-TestBundle-Build Settings-Deployment-Installation Directory清空其里面的內容

清空Installation Directory的內容

TARGETS-TestBundle-Build Settings-User-Defined-COMBINE_HIDPI-IMAGES改為NO,雙擊飘言,然后修改為NO .

設置COMBINE_HIDPI-IMAGES改為NO

把MyTestSDK改成TestBundle氏豌,然后 Edit Scheme-Run-Info-Build Configuration 修改為 Release

修改項目

到此為止,bundle目配置已經完成热凹。

創(chuàng)建好bundle泵喘,配置好后,bundle的樣式為如下所示:項目中多了個TestBundle文件夾般妙,Procucts文件夾下多了一個TestBundle.bundle文件纪铺。

TestBundle文件夾

這個時候你選擇MyTestSDK.framework,右鍵Show in Finder是顯示出來的只有MyTestSDK.framework碟渺,而沒有TestBundle文件鲜锚。這時候把SDK項目MyTestSDK改成TestBundle

MyTestSDK改成TestBundle

然后你選擇模擬器或者是真機,編譯一下苫拍,SDK項目下的Products下的TestBundle文件顏色由紅色變成白色芜繁。然后選中TestBundle,右鍵Show in Finder你會看到TestBundle绒极。

顯示bundle文件

其實把項目封裝成一個SDK骏令,就是創(chuàng)建一個靜態(tài)工程,然后把你的項目文件和資源文件放入靜態(tài)工程垄提,然后打包編譯榔袋。

把項目放入SDK工程中

把你的自己寫的項目,暴露好頭文件铡俐,自己測試好沒有任何bug了凰兑,然后把功能實現(xiàn)的.h 和.m文件以文件夾的形式拖入到SDK項目中。項目中所用的圖片审丘,全部放到TestBundle里面吏够。選中MyTestSDK.framework,右鍵Show in Finder,選中TestBundle.bundle,右鍵 顯示包內容滩报,把項目中的圖片資源放進去

把圖片放進bundle中锅知。

1:放進bundle里面的圖片,不能用

加載露泊,因為這樣的加載方式喉镰,圖片必須放入到Assets.xcassets文件夾中。但是SDK項目中惭笑,不存在這樣的文件夾侣姆。所以如果項目中有圖片,必須用下面的方式加載:

加載bundle的圖片

如果你的項目中用的有XIB沉噩,放入SDK后捺宗,打包編譯時系統(tǒng)就會放入bundle中。

2:把代碼放入SDK工程中川蒙,直接拖入即可蚜厉,然后 TARGETS-MyTestSDK-Build Phases-Headers,設置公開頭文件。

你拖入SDK項目中文件的頭文件(.h)畜眨,系統(tǒng)會默認發(fā)放你在Project下昼牛,你選中术瓮,移動到Public下面即可。

移動千
移動后

上圖中設置的每一個公開頭文件贰健,都得在你創(chuàng)建的SDK項目下的.h文件中胞四,需要引入頭文件。

引入頭文件

3:編譯bundle

在MyTestSDK工程中伶椿,TARGETS-TestBundle-Build Phases,在其copy Bundle Resources中辜伟,點擊+號,添加資源

添加資源
選中添加

編譯bundle

編譯bundle

這樣你選擇的xib或者其他資源就添加到bundle里面了脊另。


SDK編譯

SDK編譯時會根據(jù)你選擇的是真機還是模擬器导狡,生成不同的SDK,你選擇了真機偎痛,那么編譯時就會生成真機的SDK旱捧,無法在模擬器上運行;你選擇了模擬器看彼,那么編譯時就會生成模擬器的SDK廊佩,無法在真機上運行。我們?yōu)榱耸褂镁搁牛且颜鏅C和模擬器SDK合成一個标锄,具體的合成步驟,稍后會介紹的茁计。


SDK添加都新的項目中

command + B 編譯一下料皇,然后再SDK工程中的Products文件下,選中framework星压,右鍵 Show in Finder,復制后践剂,導入你的新工程中。當你把SDK導入新工程中時娜膘,framework會自動添加到Build Phases-Link Binary With Libraries 中逊脯。如果framework沒有加入到Link Binary With Libraries里面,則需要你自己點擊 + 號竣贪,自己人為導入军洼。

framework加入了libraries中,

新工程配置如下:要和SDK的配置保持一致演怎。

設置工程的最低支持iOS系統(tǒng)和支持的設備
設置Enable Bitcode


在新的工程中添加如下的代碼既可運行

添加代碼運行


SDK真機和模擬器合成匕争。

上面說過,.framework靜態(tài)庫編譯時會生成真機的framework和模擬器的framework爷耀,開發(fā)過程中為了別人使用方便甘桑,我們需要把真機的framework和模擬器的framework合并成一個framework,使之在真機環(huán)境和模擬器環(huán)境都可以運行。我是通過手動的方法合成的跑杭,沒有采用腳本的方法铆帽,后期會逐漸加入腳本的方法合成模擬器。

1:真機framework艘蹋,靜態(tài)庫工程锄贼,

靜態(tài)工程選擇一個真機(或者 Generic iOS Device),command + B 編譯運行女阀,選擇Products-MyTestSDK.framework,右鍵 Show in Finder,

真機framework

Release-iphoneos文件夾下的framework就是真機的framework.

打開終端屑迂,輸入 lipo -info 真機framework文件路徑(把framework拖進去)?浸策,回車,可以查看framework所支持的框架類型

查看framework支持的架構類型

framework拖入終端后惹盼,路徑最后一定要加上 項目的名稱(/項目名稱)庸汗。當你看到 armv7、arm64 時表明你這真機的手报;

2:模擬器framework

靜態(tài)工程選擇一個模擬器蚯舱,command + B 編譯運行,選擇Products-MyTestSDK.framework掩蛤,右鍵 Show in Finder,

模擬器framework

Release-iphonesimulator模擬器文件夾下的framework就是模擬器的framework

打開終端,輸入 lipo -info 模擬器的framework文件路徑(把framework拖進去)

模擬器的架構

framework拖入終端后,路徑最后一定要加上 項目的名稱(/項目名稱)唆鸡,回車池凄,你會看到最后的 i386 x86_64,說明是模擬器的

3:真機framework和模擬器framework合成

使用 lipo -create 進行操作

lipo -create 真機路徑 模擬器路徑 -output 真機路徑

切記每個路徑結尾都要加上你SDK工程的名稱(/文件名稱)阳藻,有些文章上沒有說明要加你SDK所在的文件名稱晰奖,則會每次合并都不成功。

真機和模擬器合并

敲擊回車后腥泥,終端命令行什么也不輸出匾南,則證明合并成功了,導入項目中蛔外,真機和模擬環(huán)境下都可以自如運行了蛆楞。

用lipo -info 查看一下,就會看到 ?armv7 i386 x86_64 arm64?

看到 ?armv7 i386 x86_64 arm64 合并成功


如果路徑后面你不加SDK所在的工程名稱冒萄,就會把下面所示的錯誤:

錯誤顯示

使用此方法把真機和模擬器的framework合成一個臊岸,有一個缺點:一旦你的靜態(tài)工程中更改了代碼,你就要在重頭來一遍尊流,重新合并生成帅戒。這個方法比較笨,但是很好掌握。還有一種合并真機和模擬器的方式就是通過腳本逻住,這種方法后面在介紹钟哥。

以后就是靜態(tài)SDK創(chuàng)建及其演示的全過程。


項目導入SDK運行后可能產生的bug

1:找不到某個文件

報警找不到某個文件

解決方法:請按照下面方法改為YES

把No改為Yes


后記:

SDK開發(fā)瞎访,沒有開發(fā)過的小伙伴可能感覺很陌生腻贰,無從下手。再者一次就開發(fā)成功估計可能行不大扒秸,大多數(shù)開發(fā)者都是第一次開發(fā)SDK播演,畢竟很少有公司會專門開發(fā)SDK給別人用,大公司除外伴奥。所以建議大家先按照步驟写烤,做一個簡單的SDK,練練手拾徙,知道問題出在哪里洲炊。有會即使你嚴格按照文章上的步驟一步一步來,也不可能馬上搞定尼啡,會有意外的問題暂衡。在我的簡書上有片文章iOS開發(fā):SDK開發(fā)相關文檔 - 簡書,上面搜集了我開發(fā)SDK時所參考的文章崖瞭,在加上我這邊文章狂巢,開發(fā)一個SDK應該沒問題了。下個文章读恃,我會介紹一下SDK開發(fā)的一些規(guī)范隧膘。

如果有不妥之處,歡迎大家下方留言寺惫。本片文章是筆者開發(fā)過程中的個人總結疹吃,不喜勿噴。


注意:以上屬于原創(chuàng)西雀,若有雷同純屬巧合萨驶;如有錯誤,請多多指正艇肴,轉載請標明來源和作者腔呜。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市再悼,隨后出現(xiàn)的幾起案子核畴,更是在濱河造成了極大的恐慌,老刑警劉巖冲九,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谤草,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機丑孩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門冀宴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人温学,你說我怎么就攤上這事略贮。” “怎么了仗岖?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵逃延,是天一觀的道長。 經常有香客問我轧拄,道長真友,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任紧帕,我火速辦了婚禮,結果婚禮上桅打,老公的妹妹穿的比我還像新娘是嗜。我一直安慰自己,他們只是感情好挺尾,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布鹅搪。 她就那樣靜靜地躺著,像睡著了一般遭铺。 火紅的嫁衣襯著肌膚如雪丽柿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天魂挂,我揣著相機與錄音甫题,去河邊找鬼。 笑死涂召,一個胖子當著我的面吹牛坠非,可吹牛的內容都是我干的。 我是一名探鬼主播果正,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼炎码,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了秋泳?” 一聲冷哼從身側響起潦闲,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎迫皱,沒想到半個月后歉闰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年新娜,在試婚紗的時候發(fā)現(xiàn)自己被綠了赵辕。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡概龄,死狀恐怖还惠,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情私杜,我是刑警寧澤蚕键,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站衰粹,受9級特大地震影響锣光,放射性物質發(fā)生泄漏。R本人自食惡果不足惜铝耻,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一誊爹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瓢捉,春花似錦频丘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至某弦,卻和暖如春桐汤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背靶壮。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工怔毛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人亮钦。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓馆截,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蜂莉。 傳聞我的和親對象是個殘疾皇子蜡娶,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內容