繼上一章后Swift Project制作靜態(tài)Framework ,有兩點需要闡明。
- 動態(tài)庫到底能不能用,因為很早前動態(tài)庫導入app不能過審。
- 如何可以讓Demo和庫聯(lián)動,最好能斷點調(diào)試bug
iOS的動態(tài)庫(被閹割的動態(tài)庫)
iOS平臺上規(guī)定不允許存在動態(tài)庫,并且所有的 IPA 都需要經(jīng)過Apple的私鑰加密后才能用,基本你用了動態(tài)庫也會因為簽名不對無法加載,(越獄和非 APP store 除外)。于是就把開發(fā)者自己開發(fā)動態(tài)庫成為了天方夜譚。 iOS8之前因為 iOS 應用都是運行在沙盒當中,不同的程序之間不能共享代碼,并且iOS是單進程的,也就是某一時刻只有一個進程在運行,那么你寫個共享庫,給誰共享呢。同時動態(tài)下載代碼又是被蘋果明令禁止的,沒辦法發(fā)揮出動態(tài)庫的優(yōu)勢,綜上所以上動態(tài)庫也就沒有存在的必要了。
但是后來iOS8之后,iOS有了App Extesion特性,而且Swift也誕生了。由于iOS主App需要和Extension共享代碼,Swift語言機制也需要動態(tài)庫,于是蘋果后來提出了Embedded Framework,這種動態(tài)庫允許APP和APP Extension共享代碼,但是這份動態(tài)庫的生命被限定在一個APP進程內(nèi)。簡單點可以理解為被閹割的動態(tài)庫。 但是這種動態(tài)庫(Embedded Framework) 和系統(tǒng)的 UIKit.Framework 還是有很大區(qū)別,傳統(tǒng)的動態(tài)庫是給多個進程用的,而這里的動態(tài)庫(Embedded Framework)是給單個進程里面多個可執(zhí)行文件用的。系統(tǒng)的 Framework 不需要拷貝到目標程序中,我們自己做出來的 動態(tài)庫(Embedded Framework) 哪怕是動態(tài)的,最后也還是要拷貝到 App 中(App 和 Extension 的 Bundle 是共享的)。所以蘋果沒有直接把這種Embedded Framework稱作動態(tài)庫而是叫Embedded Framework。
上面提到跟Swift也有原因,在Swift的項目中如果要在項目中使用外部的代碼,可選的方式只有兩種,一種是把代碼拷貝到工程中,另一種是用動態(tài) Framework。使用靜態(tài)庫是不支持的。這個問題的根本原因主要是 Swift 的運行庫沒有被包含在 iOS 系統(tǒng)中,而是會打包進 App 中(這也是造成 Swift App 體積大的原因),靜態(tài)庫會導致最終的目標程序中包含重復的運行庫。
開始制作SDK(以動態(tài)庫為例)
-
將最開始創(chuàng)建的Framework 和 Demo App 放到同一個目錄下,并且創(chuàng)建平行級別的WorkSpace
,這里WorkSpace的名字需與Demo App相同。如下
工程結構 -
打開WorkSpace,將工程和Framework都導入。注意: 兩者為同級關系
image.png
統(tǒng)計關系 -
把Framework添加到App工程中
導入Framework 運行即可,在Framework打斷點也可以進行調(diào)試。這里也就實現(xiàn)了斷點調(diào)試。
-
如果要導出Framework給別人使用,需要Edit Scheme,將Debug變?yōu)镽elease
截屏2024-12-23 14.23.40.png




