公司由于業(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)庫配置
TARGETS-General-Deployment Info碎浇,設置支持iOS系統(tǒng)的最低版本和支持的設備
TARGETS-Build Settings-Linking 璃俗,選擇 Static Library(靜態(tài)庫)奴璃,系統(tǒng)默認的是Dynamic Library(動態(tài)庫)。這個一定要記得改城豁,切記一定要改苟穆,否則你創(chuàng)建的就不是靜態(tài)庫
TARGETS-Build Settings-Build Options,將 Enable Bitcode修改為No.
Edit Scheme - Run - Info - Build Configuration 修改為Release
在SDK項目中創(chuàng)建Bundle
個人以為有以下倆中方法:
1:在桌面上創(chuàng)建一個空的文件夾唱星,然后文件名稱修改為.bundle結尾雳旅,那么系統(tǒng)就把這個文件轉變成bundle文件,然后拖入你的SDK項目中间聊。(本人親自測試攒盈,可以的)
2:選中Xcode項目,然后選擇左上角的 File-New-Target-macOS-Bundle
然后做如下配置:
TARGETS-TestBundle(你的bundle名稱)-Build Settings -Architectures-Base SDK 設置為iOS
這里在SDK工程中創(chuàng)建bundle后哎榴,在General-Signing可能會報錯型豁,例如:
解決方法是:把 Automatically manage signing 前面的??去掉,然后在重新打上??尚蝌,彈框選擇Enable Automatic ,然后在 team 一欄在選擇一個開發(fā)者賬號即可迎变。
TARGETS-TestBundle-General-Deployment Info:修改 所支持的iOS版本和設備
TARGETS-TestBundle-Build Settings-Build Options:修改 Enable Bitcode為NO
TARGETS-TestBundle-Build Settings-Deployment-Installation Directory清空其里面的內容
TARGETS-TestBundle-Build Settings-User-Defined-COMBINE_HIDPI-IMAGES改為NO,雙擊飘言,然后修改為NO .
把MyTestSDK改成TestBundle氏豌,然后 Edit Scheme-Run-Info-Build Configuration 修改為 Release
到此為止,bundle目配置已經完成热凹。
創(chuàng)建好bundle泵喘,配置好后,bundle的樣式為如下所示:項目中多了個TestBundle文件夾般妙,Procucts文件夾下多了一個TestBundle.bundle文件纪铺。
這個時候你選擇MyTestSDK.framework,右鍵Show in Finder是顯示出來的只有MyTestSDK.framework碟渺,而沒有TestBundle文件鲜锚。這時候把SDK項目MyTestSDK改成TestBundle
然后你選擇模擬器或者是真機,編譯一下苫拍,SDK項目下的Products下的TestBundle文件顏色由紅色變成白色芜繁。然后選中TestBundle,右鍵Show in Finder你會看到TestBundle绒极。
其實把項目封裝成一個SDK骏令,就是創(chuàng)建一個靜態(tài)工程,然后把你的項目文件和資源文件放入靜態(tài)工程垄提,然后打包編譯榔袋。
把項目放入SDK工程中
把你的自己寫的項目,暴露好頭文件铡俐,自己測試好沒有任何bug了凰兑,然后把功能實現(xiàn)的.h 和.m文件以文件夾的形式拖入到SDK項目中。項目中所用的圖片审丘,全部放到TestBundle里面吏够。選中MyTestSDK.framework,右鍵Show in Finder,選中TestBundle.bundle,右鍵 顯示包內容滩报,把項目中的圖片資源放進去
1:放進bundle里面的圖片,不能用
加載露泊,因為這樣的加載方式喉镰,圖片必須放入到Assets.xcassets文件夾中。但是SDK項目中惭笑,不存在這樣的文件夾侣姆。所以如果項目中有圖片,必須用下面的方式加載:
如果你的項目中用的有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
這樣你選擇的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里面,則需要你自己點擊 + 號竣贪,自己人為導入军洼。
新工程配置如下:要和SDK的配置保持一致演怎。
在新的工程中添加如下的代碼既可運行
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,
Release-iphoneos文件夾下的framework就是真機的framework.
打開終端屑迂,輸入 lipo -info 真機framework文件路徑(把framework拖進去)?浸策,回車,可以查看framework所支持的框架類型
framework拖入終端后惹盼,路徑最后一定要加上 項目的名稱(/項目名稱)庸汗。當你看到 armv7、arm64 時表明你這真機的手报;
2:模擬器framework
靜態(tài)工程選擇一個模擬器蚯舱,command + B 編譯運行,選擇Products-MyTestSDK.framework掩蛤,右鍵 Show in Finder,
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?
如果路徑后面你不加SDK所在的工程名稱冒萄,就會把下面所示的錯誤:
使用此方法把真機和模擬器的framework合成一個臊岸,有一個缺點:一旦你的靜態(tài)工程中更改了代碼,你就要在重頭來一遍尊流,重新合并生成帅戒。這個方法比較笨,但是很好掌握。還有一種合并真機和模擬器的方式就是通過腳本逻住,這種方法后面在介紹钟哥。
以后就是靜態(tài)SDK創(chuàng)建及其演示的全過程。
項目導入SDK運行后可能產生的bug
1:找不到某個文件
解決方法:請按照下面方法改為YES
后記:
SDK開發(fā)瞎访,沒有開發(fā)過的小伙伴可能感覺很陌生腻贰,無從下手。再者一次就開發(fā)成功估計可能行不大扒秸,大多數(shù)開發(fā)者都是第一次開發(fā)SDK播演,畢竟很少有公司會專門開發(fā)SDK給別人用,大公司除外伴奥。所以建議大家先按照步驟写烤,做一個簡單的SDK,練練手拾徙,知道問題出在哪里洲炊。有會即使你嚴格按照文章上的步驟一步一步來,也不可能馬上搞定尼啡,會有意外的問題暂衡。在我的簡書上有片文章iOS開發(fā):SDK開發(fā)相關文檔 - 簡書,上面搜集了我開發(fā)SDK時所參考的文章崖瞭,在加上我這邊文章狂巢,開發(fā)一個SDK應該沒問題了。下個文章读恃,我會介紹一下SDK開發(fā)的一些規(guī)范隧膘。
如果有不妥之處,歡迎大家下方留言寺惫。本片文章是筆者開發(fā)過程中的個人總結疹吃,不喜勿噴。