[iOS]探秘系列之-SDK開發(fā)

背景

最近入職了一家新公司,進來之后分配到的任務是為公司APP和客戶做插件化服務(勘誤:在ios中說插件化,怕是要翻水水),也就是做SDK開發(fā).之前開發(fā)APP的時候總是吐槽別人家的SDK很難用,各種使用上的坑.現(xiàn)在輪到自己來做了,心里難免會有一種翻水水的感覺,哈哈......

初識SDK

iOS中SDK開發(fā)通常有兩種方式:

StaticLibrary
Framework

至于如何創(chuàng)建StaticLibraryFramework的方法這里就不細說了.我這里采用的Framework的方式來開發(fā),原因是Framework只會加載一次,比較省空間(移動設備的內存通常都是比較珍貴的).
其中Framework工程的BuildSetting中Mach-O Type 設置為 Static Library;

開發(fā)過程

  1. 當我創(chuàng)建好一個framework工程之后,我編寫了一些簡單的代碼用來測試,如下圖:


    測試代碼.png

    功能是:電話號碼和密碼有為空的情況就彈出一個警告框,并且回調一個bool值判斷是否登錄成功.

  2. 經(jīng)過編譯之后在Products文件下可以看到framework已經(jīng)生成了:



    然后找到framework的生成文件,拖入到實現(xiàn)準備好的測試demo項目.

  3. 在測試demo的ViewController.m文件中,我導入了測試的頭文件MenuSDK.h,調用了framework中的方法,然后運行.
登錄界面

點擊登錄之后按道理應該會有彈窗的出現(xiàn)提示為空的,這里卻并沒有顯示,這里是用sb拖入控件的方式.

那么問題來了

  • 問題一:利用xib或者sb拖入的UITextField控件默認值是@"",而不是nil,所以我判斷的方式if(!text)有問題,于是加了不為@""的情況,然后我在framework工程中更改代碼之后,重新編譯,然后又拖到demo工程中,運行之后點擊,效果出現(xiàn)了.嗯,很開心.
  • 問題二:在這個過程中,每次修改完framework代碼之后都需要重新編譯并且將包拖入到demo工程中,如此反復幾次之后,簡直深惡痛絕,這樣搞會讓人崩潰的!如果把framework工程和demo工程一起管理,編譯demo工程的時候framework工程就自動更新好了那該多好!

問題二解決方式:
(1) 打開demo工程,File->New->Workspace,新建一個workspace,用來管理demo和framework.
(2) 這時候會出現(xiàn)一個空白的workspace界面,先不動它.關掉demo和framework工程,將兩者根目錄下的xcodeproj拖入到剛剛新建的workspace工程中,如下圖:

workspace

(3)在demo的target中Embedded BinariesLinked Frameworkd and Libaries都要添加MenuSDK.framework

(4) 這時運行會報錯,找不到頭文件MenuSDK.h,因為在demo的build setting中沒有指定header search paths,雙擊后面的空格,將MenuSDK.frameworkHeaders路徑拖入其中即可,因為在framework中頭文件都是在Headers目錄下:

最后成功運行!于是就完成了demo和framwork的統(tǒng)一管理,極大方便了SDK的開發(fā)和調試.

  • 問題三:本來以為將兩者統(tǒng)一到workspace中就基本沒啥問題了,但是后來手賤搞了一個分類到framework中,然后呢,奇怪的一幕發(fā)生了,當我將分類import到.m文件里時,編譯沒問題.后來想到improt到.h中更好,于是順利的按照提示import了,但這時候報錯了,說找不到分類文件......氣哭!好吧,還是import到.m中,這下總沒問題了吧.運行,報錯,定位到使用分類方法的位置,提示:Unrecognize selector.......

這里有兩個點:
1.為啥import到.h文件中找不到分類
2.導入.m文件中后方法未識別.
解決方式:
咨詢了一位搞SDK的老司機之后,他回復了一句話:-ObjC,專治分類.恍然大悟,于是立馬去framework的buildSetting中設置other link flag-ObjC,問題解決,分類也可以使用了.心中一萬只那啥跑過......猜測一下原因應該是分類是屬于OC獨有的語法特性,所以需要指定-ObjC,額,我能想到就只有這么多了.

  • 問題四:framework通常是搭配bundle來使用的,并且蘋果不允許將bundle打進framework包里.那如何使用bundle管理資源文件(圖片,音頻等)呢?

創(chuàng)建bundle有兩種方式:
(1) xcode里面setting bundle
(2) 新建一個文件夾,放入資源文件,然后修改后綴為.bundle
這里我采用的是第二種方式.將bundle拖入到項目中.但是由于是將資源放入了bundle中,那么讀取文件的方式就不同了,以圖片為例:


就需要取到bundle的path來讀取了.

以上就是這兩天研究SDK開發(fā)遇到的一些實際問題,路才剛剛開始,希望自己以后的SDK開發(fā)之路一()路()順()利().

最后鳴謝羅老板給與的無私幫助!
9-4日更新:

當我們需要在SDK中集成其他sdk的時候,例如我的sdk中接入微信支付的SDK,那么這個時候我們需要將wxpay.a以及header拖入到我們項目中,引入依賴庫即可.

但是,如果需要集成的是framework的話,親測,直接拖入framework集成暫時不可行(不知道是我哪里搞錯了沒),于是乎查閱了網(wǎng)上的資料,發(fā)現(xiàn)framework只是對.a文件的一次封裝,我們只需要將framework中的二進制文件:

添加一個后綴.a,同時將這個轉換的.a文件拖入Headers中,最后將這個Headers文件拖入你的SDK項目中,添加依賴文件即可引用.如下圖效果:

2018-3-27補充:framework中如何做到不直接依賴AFN等三方庫
1.首先我們新建一個Lib的framework,里面放入AFN等三方框架,建議是直接拖入代碼.如下圖:


此時我們需要去target里面配置Build phases,將AFN所有的頭文件全部設置為public(很重要):

2.我們再建立我們自己的framework Task,里面放入業(yè)務代碼.然后建立一個workspace,workspace位置可以放在Task工程目錄中,同時導入lib和Task:


并且Task中關聯(lián)lib.framwork:

接著在build setting里面設置framwork search path lib的framwork地址,header search path為lib framwork的headers地址.

最后在我們的業(yè)務里面可以直接導入三方的頭文件,使用即可:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容