使用Swift開發SDK的優點是,生成的SDK對於Obj-C或是Swift調用都不需要自己去建橋接文件,因為Swift的SDK打包時默認已經自動生成供OC調用的.h文件。OC調用時直接import,sdk中的.h文件即可。而Swift調用時,import該SDK名即可。
制作SDK的整個過程也十分簡單,網上的博客多的不能再多(大多基於OC)。
使用Swift開發,里面會遇到千奇百怪的坑!所以寫這篇博客的目的分享下這些坑的解決經驗。
1.工程組合的方式:
開發SDK,不建議直接把SDK當APP開發,不然每次SDK的導出非常麻煩。建議采用SDK工程和Demo工程組合的方式,這樣利於導出也利於調試。
首先你新建一個framework的工程A開發SDK,再建立一個普通的APP工程B,然后把工程A拖到工程B中,這樣就組成了一個工程。下次在開發的時候直接使用B工程開發即可。
這里需要注意的是,假如你需要在B中使用SDK,就需要把A產出的Product里的XXX.framework供B來引用,這里需要在B的demo工程中的Build Phases里設置2-3個地方去添加,比如
(1)Link Binary With Libraries
(2)embed frameworks
(3)copy bundle resources (假如該framework有圖片,xib等資源,這里有個關於bundle的注意點下面等等會提到)
2.第三方的管理:
在開發SDK時,開發者應該有一個共識,那就是千萬不能把三方的源碼打包進自己的SDK。比如我需要用到MBProgressHUD,我把它封進SDK里,不但程序會很大,別人再次導入也會產生編譯沖突。所以最好還是使用CocoaPods,在文檔中告訴別人使用的三方庫和版本號。
3.橋接文件:
假如我們在Swift的SDK中需要引用到OC文件,是不需要添加橋接文件的。(在普通app工程中是需要的)swift的SDK工程會自動生成一個xxxx.h的頭文件,你需要做的有2步:
(1)在.h中import你使用到OC類的頭文件。
(2)在SDK的工程設置中的Headers里,把.h放到public中,如下:
假如你之前的工程使用到了橋接文件,你要把它改成SDK,你需要把橋接文件干掉,然后把里面import的東西搬到xxxsdk.h中。
4.資源文件的調用:
假如你在SDK中使用到圖片,Xib,Storyboard等資源,在APP中也許我們能直接調用,比如UIImage(Named:"xxx"),但是普通的APP會默認搜索工程目錄,這也稱為MainBundle。
但是SDK中,資源文件是以工程目錄/xxxSDK.Framework/xxx.png的形式存放的,所以按直接名字取的方法,絕對是直接崩潰的。
這個坑我還沒有找到完美的解決辦法。
(1)最合理的方式,必然是把所有的資源文件,包括XIB、圖片等全部加入一個Bundle,但是Bundle的位置也是在SDK中,同樣尷尬的無法找到。解決辦法是,在該資源的位置前面,加入xxxSDK.Framework/xxx.bundle找到這個Bundle,然后再去找到圖片,但是Bundle這東西,太垃圾了,非常難用。
(2)一個比較簡單,但不是很規范的方法,定義一個全局變量let SourceRootUrl = "xxxSDK.Framework/",然后在每次調用資源前面,加入這個目錄關系,比如圖片,UIImage(Named:SourceRootUrl+"xxx"),xib,storyboard同樣需要。
關於這點,我覺得Xcode在之后應該會推出更好的解決辦法。
5.CPU架構的支持:
這點非常坑,Xcode能debug出或者release出的架構非常單一,要么是真機架構的,要么是模擬器架構的,但實際上我們提供給開發者的SDK可能是真機和模擬器兩個平台都需要的。
所以我們可以對兩個庫進行合並,使用lipo -create a b -output c (具體方式自己百度搜索lipo -create),【這里要注意的是我們合並的是xxxSDK.Framework里的xxxSDK文件,而不是整個framework,合並成c后,我們再放入替換某個a或b】
但是這里有個坑,使用swift開發出的SDK,通過lipo -create合並出的Framework,OC是模擬器和真機都能調用的,但是Swift的工程缺只能調用其中1個,可能是和這種合並不是非常規范。
這一點,官方居然不提供點更直接點的方法?
然后就是,關於armv7s的架構(僅iPhone5),Xcode默認已經不支持,所以假如你其中一個第三方不支持armv7s,你的SDK也就不支持了,人家的APP也不可能支持了。
6.重名問題:
SDK的啟動類和SDK名,不要命名成一樣的。否則你會后悔的。
7.刪除framework后殘留問題
有時候也許你明明已經把SDK從工廠中挪走了,但是編譯的時候還是不通過,甚至運行的時候出現未找到xxxSDK。
為什么?因為Xcode非常傻*。你把SDK挪走了,但是你之前加過target,link with libraries,bundle等還殘留着之前那個目標framework,然后一運行,還是試圖去加載之前那個framework,就崩潰了,真是傻啊。
8.莫名崩潰,又莫名好了
我感覺Xcode的隱形BUG已經非常的多了,尤其是結合Storyboard或是Xib后,BUG直接多一個數量級。
所以這也是很多人建議少用界面編輯器去做APP的原因,有時候就是莫名其妙的錯。
然而你可能重啟下電腦,關閉下Xcode,或許clean up一下,也許根本就沒問題。
所以假如出現了一個長達幾小時讓人自信到不可能有問題的BUG,不妨重啟clean up -> 重啟Xcode -> 重啟電腦下。