公司開發的SDK,是集成了各個平臺的商品,包括購買、分享、提現等功能,為了加快進度,我是使用了一些第三方。但是有些需求,比如分享到微信朋友圈或者還有,必須用到微信的SDK。考慮到后期的維護成本和集成,筆者采用了cocoapods管理第三方庫。
饒河網站建設公司創新互聯,饒河網站設計制作,有大型網站制作公司豐富經驗。已為饒河上千提供企業網站建設服務。企業網站搭建\成都外貿網站建設公司要多少錢,請找那個售后服務好的饒河做網站的公司定做!
筆者有片文章專門介紹SDK的開發步驟的,大家可以參考,我這里就直接進入主題了。
首先,你創建一個靜態的framework工程MyTestSDK,把這個工程集成cocpapods,至于如何集成cocpapods,網上有教程,自己搜索。這個時候把你項目中所用的第三方庫添加到Podfile文件中,然后 pod install。這個時候你command + B 編譯運行,如果你的第三方庫中還有Bundle資源,那么編譯后,第三方庫的bundle資源會被編譯,一起放到Products文件下的framework文件中,右鍵Show in Finder就會看到。如下圖所示的MBProgressHUD文件夾,里面都是MBProgressHUD第三方的資源文件。
然后把你的項目放入SDK工程中,編譯運行一下,看看有沒有錯誤。之所以先把SDK工程選用cocoapods管理,就是怕你的項目放入SDK中運行報錯。沒有任何問題,直接編譯即可。
由于SDK中的第三方是通過cocoapods管理的,所以接入者的項目也要用cocoapods管理。
1:把SDK工程中,Products文件夾下的framework文件copy到項目中,最好項目中建立一個文件夾,專門放SDK和bundle。我是放到了一個文件夾中,方便分類尋找。如下圖所示:
2:打開終端,cd到SDK所在的文件夾下,執行如下命令,回車,創建spec文件。
其中,MyTestSDK是你的SDK名稱。
創建出來的spec文件,是個很長的文件,但是大部分都是注釋的,我這里只提取了有用的信息展示出來:
然后把spec中依賴的第三方庫,逐個加入到項目中的Podfie文件中。然后 終端打開,cd到自己的項目中,pod install即可。
本人親自測試過的,No Problem。當初感覺SDK如果依賴了第三方庫,接入的項目中也有同樣的第三方庫,會不會沖突啊,感覺好難搞啊。事實證明,通過spec進行依賴,可以很好的解決這個問題,也就沒有那么麻煩了。
首次開發SDK還是遇到了很多問題,運行出現很多bug,但是最后還是一一解決了,就是沒有記錄下bug和解決發的方法。
1;path路徑不對,就會報錯 ,如下
是因為我把路徑寫成了:
其實正確的寫法是:把“/”放在前面
2:SDK中有第三方,但是項目中的Podfile里面沒有這個第三方,報錯如下所示:
解決辦法是就是在項目中的 Podfile里面加入缺失的第三方庫,重新 pod install。
軟件開發工具包(縮寫:SDK,英語全稱:Software Development Kit),一般都是一些軟件工程師為特定的軟件包、軟件框架、硬件平臺、操作系統等建立應用軟件時的開發工具的集合。
在OC的開發中,我們涉及到的一般是靜態庫(.a)或者動態庫(.framework)。(注:不是所有的.framework就一定是動態庫)
.a是一個純二進制文件,.framework中除了有二進制文件之外還有資源文件。 .a文件不能直接使用,至少要有.h文件配合(微信的SDK就是這種形式),.framework文件可以直接使用。 .a + .h + sourceFile = .framework。 建議用.framework。再者 靜態方式開發,一直是iOS SDK開發的主流方式。
終端輸出為:armv7 arm64 是真機架構;i386 x86_64 是模擬器架構。
終端輸出為:arm64 是真機架構;x86_64 是模擬器架構。
Bundle 和 其他的SDK都要和創建的SDK放在同一個文件夾,然后拖入要使用的項目中,如果該項目中的SDK和創建的SDK中的引用的SDK重復,那么就只要保持存在一個就好了。
iOS SDK開發就是為某一個應用場景、或領域、或需求,提供一個已實現的、封裝好的、可供直接使用的模塊。
其主要由兩部分組成:用來為類型或常量聲明的頭文件列表、具體實現的二進制文件。
所以SDK開發中的主要問題點集中在:
1. 頭文件是否能被使用的工程索引到
2. 二進制文件是否能被使用的工程搜索到
本篇文章不寫制作SDK的具體步驟,僅僅討論制作SDK時的一些情形。
SDK開發中關于頭文件設置:
凡是提供給外界使用的類、結構體、枚舉、常量等,定義它們的頭文件必須要在工程的Build Phases-Headers-public下面。并且這些頭文件都需要包含在與SDK工程同名的頭文件中(這條不是必須,只是這么做會顯得更加規范。別人使用SDK的時候,只需要引入SDK同名的頭文件即可)
設置庫文件生成動態的還是靜態的:
Project Name-Target Name-Build Settings-搜索框搜“Mach”-修改“Mach-O Type”為動態或靜態,則相應可生成動態或靜態的庫文件。
先解釋說明以下圖片中出現的工程名字:
SDKDemo :制作的向外提供的SDK庫文件(與SDK工程名同名)
SDKApp :引用SDK庫文件(本文指的是SDKDemo)的App工程
SDKStatic :新建工程時,選擇iOS-Framework Library-Cocoa Touch Static Library. 用來生成.a文件的工程
SDKFramework : ?是個Framework庫文件(可能是動態的,也可能是靜態的),用于模擬被SDK依賴的.framework文件
下面分幾種情況來討論SDK開發的注意事項:
1. 生成動態SDK庫文件。
創建工程的時候,根據默認配置編譯是生成動態庫的。
App工程中引入動態庫的時候,需要在
App工程:Project Name-Target Name-General-Embedded Binaries下添加引入的動態庫。否則運行時會報如下類型錯誤:
嵌入動態庫編譯后,生成的App文件中會多一個Frameworks目錄(可右鍵.App文件查看包內容),里面全是Embedded Binaries下添加的動態庫
2. 打包為靜態庫
SDK工程:Project Name-Target Name-Build Settings-搜索框搜“Mach”-修改“Mach-O Type”為靜態庫
App工程引入靜態庫很簡單,直接引入就行,不需要額外配置:
tips:
合并真機與模擬器版本時的命令格式為:
lipo -create?模擬器版本的路徑?真機版本的路徑 -output 合并后的版本存放路徑
1. 合并時lipo -create接收的模擬器版本和真機版本兩個參數的前后順序沒有關系,合并后的版本通過命令查看架構信息顯示結果是完全一致的。模擬器架構信息顯示在前,真機架構信息在后。
2. 合并后的版本無論替換真機版本的Framework中的目標文件還是模擬器版本的Framework中的目標文件,App工程中引入被替換的Framework后在真機和模擬器上都能跑起來
首先創建SDKStatic工程,生成一個.a文件。
該工程只是簡單繼承了UIButton,并重寫了initWithFrame方法。為每一個MyButton對象默認生成標題和背景色:
生成的.a文件如下,可以看到里面包含了MyButton.o文件:
在SDK工程中引入.a文件。下面分兩種情況來看生成的SDK庫文件:
1. SDK庫文件做成動態庫(設置方法看開頭部分)
.a文件內容被整合進了SDK動態庫文件中,引入App工程中時,只需要引入SDK動態庫就可以了
2. SDK庫文件做成靜態庫(設置方法看開頭部分)
包中的信息:
.a文件內容同樣被整合進了SDK靜態庫文件中,這個更好理解。引入App工程中時,只需要引入SDK靜態庫就可以了
總結下:
制作SDK庫時,如果有依賴的.a文件,則最終生成的SDK庫文件會合并.a文件的內容,而不論SDK庫文件是動態還是靜態的。
下面的SDKFramework是個Framework庫文件(可能是動態的,也可能是靜態的)
SDKFramework工程添加的內容和SDKStatic工程是一樣的。也是自定義MyButton,默認生成標題和背景色(拷貝文件到工程):
SDKDemo工程自定義了MyView,默認生成的MyView對象添加了一個MyButton按鈕和背景色:
1. 如果.framework文件是動態庫
a. SDK打包為靜態庫,如下:
靜態SDK包和動態SDKFramework.framework文件是彼此獨立的。引入靜態SDK包時,必須也導入SDKFramework.framework,否則編譯不過,因為靜態包有引入動態庫中的符號。
b. SDK打包為動態庫,如下:
兩者還是彼此獨立的。動態SDK包中會記錄依賴的動態.framework rpath,App運行時,dyld會根據這個信息去加載對應的.framework依賴文件。如果找不到App將會在啟動時奔潰...
2. 如果.framework文件是靜態庫
a. 首先SDK打包為動態庫看看:
經實踐,依賴的靜態庫會被整合進動態SDK包自身中。App中引入時,只需要導入SDK包就可以。我們在SDKApp中導入SDKDemo,運行可以看到如下效果:
b. 再看看SDK打包為靜態庫:
根據上面截圖中信息,App中導入SDK包時,也必須導入依賴的.framework了。否則編譯時將會出現如下圖所示找不到符號的錯誤:
追加導入依賴的.framework,再次編譯運行。OK!!!
總結:
1. 依賴的.framework為動態庫
制作的SDK庫文件不論動態還是靜態的。和依賴的.framework文件本身是彼此獨立的,不會發生符號整合的現象
2.?依賴的.framework為靜態庫
如果制作的SDK庫文件是動態的,則依賴的.framework靜態庫內容會被整合進SDK庫文件中
如果制作的SDK庫文件是靜態的,則彼此是獨立的
這里又得分幾種情況討論:
1. Podfile中不使用use_frameworks! ?pods庫生成的是.a文件
a. 如果SDK制作成靜態庫:
? SDK靜態庫不會整合Pods里三方庫中的符號,最終導入App工程時,需要SDK靜態庫、Pods中的三方庫文件一起導入
b. 如果SDK制作成動態庫:
? Pods庫中的符號會被合并整合進入SDK庫中,導入工程時,只需要導入SDK包就OK了
2. Podfile中使用use_frameworks! ?pods庫生成的是.framework文件。其中Pods_工程名.framework文件是個靜態庫,管理的第三方庫生成的是framework動態庫
a.如果SDK制作成動態庫:
SDK中會包含引入三方庫的rpath,App中引入SDK包時,也必須引入三方庫,否則dyld加載不了指定庫導致App啟動時奔潰
b. 如果SDK制作成靜態庫:
靜態SDK中會忽略Pods中的庫中定義的符號(也即彼此是獨立的)。如果靜態SDK中引用了動態pods庫中定義的符號,只要在App工程中也導入pods中動態庫,并在embeded binaries中添加。一樣是可以編譯運行的。
其實怎么編譯,SDK工程中是個什么情形都不重要。重要的是要明白庫文件的本質,及它是如何發揮作用的?在什么階段發揮作用?然后學會查看編譯運行時的報錯信息,并配合使用otool、nm、lipo、ar、file等這些命令去查看庫文件的一些信息,最終追蹤定位到問題。
原諒我最后都沒怎么貼圖了,因為流程都和前面差不多。我也寫的手累了。如果你還有什么疑惑可以在下面評論,我會盡量及時回復。
網頁標題:ios開發sdk,iOs開發自身優勢
瀏覽地址:http://m.2m8n56k.cn/article12/phpedc.html
成都網站建設公司_創新互聯,為您提供ChatGPT、面包屑導航、建站公司、網頁設計公司、外貿網站建設、云服務器
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:[email protected]。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯