公司開發(fā)的SDK,是集成了各個平臺的商品,包括購買、分享、提現(xiàn)等功能,為了加快進度,我是使用了一些第三方。但是有些需求,比如分享到微信朋友圈或者還有,必須用到微信的SDK。考慮到后期的維護成本和集成,筆者采用了cocoapods管理第三方庫。

為漢源等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及漢源網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站設(shè)計制作、成都網(wǎng)站建設(shè)、漢源網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
筆者有片文章專門介紹SDK的開發(fā)步驟的,大家可以參考,我這里就直接進入主題了。
首先,你創(chuàng)建一個靜態(tài)的framework工程MyTestSDK,把這個工程集成cocpapods,至于如何集成cocpapods,網(wǎng)上有教程,自己搜索。這個時候把你項目中所用的第三方庫添加到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所在的文件夾下,執(zhí)行如下命令,回車,創(chuàng)建spec文件。
其中,MyTestSDK是你的SDK名稱。
創(chuàng)建出來的spec文件,是個很長的文件,但是大部分都是注釋的,我這里只提取了有用的信息展示出來:
然后把spec中依賴的第三方庫,逐個加入到項目中的Podfie文件中。然后 終端打開,cd到自己的項目中,pod install即可。
本人親自測試過的,No Problem。當(dāng)初感覺SDK如果依賴了第三方庫,接入的項目中也有同樣的第三方庫,會不會沖突啊,感覺好難搞啊。事實證明,通過spec進行依賴,可以很好的解決這個問題,也就沒有那么麻煩了。
首次開發(fā)SDK還是遇到了很多問題,運行出現(xiàn)很多bug,但是最后還是一一解決了,就是沒有記錄下bug和解決發(fā)的方法。
1;path路徑不對,就會報錯 ,如下
是因為我把路徑寫成了:
其實正確的寫法是:把“/”放在前面
2:SDK中有第三方,但是項目中的Podfile里面沒有這個第三方,報錯如下所示:
解決辦法是就是在項目中的 Podfile里面加入缺失的第三方庫,重新 pod install。
最近公司由于業(yè)務(wù)需求,需要提供一個SDK以供第三方公司的集成開發(fā),之前沒有這方面的開發(fā)經(jīng)驗有點迷茫。然后就在網(wǎng)上查看了一些相關(guān)的資料,自己研究了一天,成功的封裝出了自己iOS開發(fā)過程中的第一個SDK包。同時也是為了以后開發(fā)SDK留下一個比較完整的筆記。
SDK的英文全名是:software development kit,翻譯成中文的意思就是“軟件開發(fā)工具包”,我個人的理解就是一個工具包,完全可以理解成開發(fā)中我們的一個公共類。
二、怎么實現(xiàn)SDK的封裝呢?
1.打開Xcode開發(fā)工具創(chuàng)建我們的工具類
注:本文中使用的開發(fā)工具為xcode9.3
創(chuàng)建完成后
創(chuàng)建完成后,我們新建兩個繼承于基類的文件,一個用于封裝網(wǎng)絡(luò)請求一個用于封裝我們需要提供給他人使用的方法以及需要動態(tài)改變的參數(shù)。
2.網(wǎng)絡(luò)請求添加到SDK中一起封裝
因為我們封裝的SDK有的數(shù)據(jù)涉及到網(wǎng)絡(luò)請求,所以我們封裝的時候,順便把需要用到的網(wǎng)絡(luò)請求也封裝進去。
1).使用cocoapods導(dǎo)入第三方庫AFNetWorking
具體使用 見印象筆記內(nèi)容,包含了使用cocoapods遇到的問題以及解決方法: ??
2).在封裝的SDK中如果涉及到使用第三方的庫引用的時候,一定要在.m文件中進行引用
3.做完想要封裝的文件后,開始進行封裝
先進行編輯設(shè)置,在product --Scheme---Edit Scheme
此處必須是release,不能用debug模式,選擇SDK是在iOS 、tvOS還是watchOS 4上面運行的SDK,在這兒我們選擇iOS
在build Setting里面 搜索linking 設(shè)置Mach-O Type 為 static library
在build Phases --- headers 中添加需要暴露的類,將Project里面想暴露的文件.h拖動到Public里面進行文件暴露
完成所有設(shè)置后,我們進行真機編輯和模擬器編輯最后合并成一個可以在真機和模擬器上運行的第三方SDK,
4.到這一步我們的SDK封裝就差最后一步了,合并成能在真機和模擬器上運行的SDK
選中編輯好的包,我這兒是Demo_SDK.framework然后右擊顯示文件內(nèi)容
找到這兩個文件后,我們開始合并,得到我們想要的SDK
1).打開終端---輸入lipo -create 加上文件路徑
1.為真機的文件,2為模擬器的文件,3為合并后輸出問的地址
注意:我們所合并的文件是Demo_SDK,并不是所有的文件
合并到處文件為lipo結(jié)尾的
更改合并和的文件名稱和合并前文件名稱相同,并且去掉后綴。用合并和的文件替換掉和并前的文件
合并完成后拷貝處我們封裝的SDK,在其他項目中引用就可以了
總結(jié):截圖比較多,為了照顧像我這樣的小白,希望大家理解。第一次寫,不喜勿噴,這只是作為自己的個人筆記,如果有什么不對的地方,希望大家指出一起交流學(xué)習(xí),Thanks?(?ω?)?
Demo鏈接:
因為公司的組件化開發(fā)的深入,雖然自己只是使用不需要去處理組件(組件模塊是另外的小伙伴+大佬架構(gòu)師負責(zé)的),還是需要自己造輪子。就屢屢了...花了點時間整理了下簡單的,這些都是為組件做基礎(chǔ),后續(xù)會持續(xù)更新并實現(xiàn)組件。
廢話就不多說了,關(guān)于SDK可以自行百度這邊就不扯了,開始下面的正文。
靜態(tài)庫: .a 和 .framework
動態(tài)庫: .dylib 和 .framework
選擇 Cocoa Touch Static Library :
Build Active Architecture Only 設(shè)置為YES,表示只編譯當(dāng)前的 Architecture 版本,為了適配各種機型需要關(guān)閉當(dāng)前的設(shè)置。
可以在編譯完成后查看生成的靜態(tài)庫支持的系統(tǒng)架構(gòu),終端命令:
結(jié)果如下:
一般第三方只提供 release 的版本。
這邊就不多講了,國際化語言跟平時設(shè)置是一樣的,具體的就附上個通道吧 iOS之SDK開發(fā)的總結(jié) ,查看上面介紹的第四點即可。
真機、模擬器各需要運行一次生成對應(yīng)的靜態(tài)庫,根據(jù) 第4點 切換環(huán)境編譯生成對應(yīng)的靜態(tài)庫,編譯快捷鍵 cmd + B 。
如何查看編譯是否成功,查看工程目錄如下圖紅色框里面的名字,如果是紅色的則未編譯,下圖是已經(jīng)編譯后的顏色:
編譯完成后可以點擊上面紅色框 Show In Finder 進入該文件目錄。
終端命令
注 :格式如上,上面的空格不是為了美觀,而是格式
舉個例子:
靜態(tài)庫制作完成,將靜態(tài)庫拖入工程中,記得導(dǎo)入相應(yīng)需要暴露的頭文件。因為靜態(tài)庫沒有提供相應(yīng)的頭文件,只是單純的一個.a文件。
使用 framework 制作靜態(tài)庫的方法就放到 動態(tài)庫 中一起說明,具體的可以查看 動態(tài)庫--2、配置Mach
在制作動態(tài)庫上跟制作靜態(tài)庫的流程是大同小異,主要介紹不同的。
新建工程,選擇如下:
Mach-O Type 默認為動態(tài)庫,如果需要制作靜態(tài)庫的話在這邊修改 framework 類型即可。
配置完成后, cmd + B 分別編譯生成模擬器、真機 Framework 。
終端命令與制作.a靜態(tài)庫是一樣的,不同的是選擇的文件,需要用來合并的文件如下:
終端命令如下:
別忘了該空格的地方帶上空格。
舉個例子:
輸出的文件是 result.lipo ,它的格式是 .lipo ,將該文件修改成合并文件時的文件名并放入其中一個 framework 中替換,通用的 Framework 制作好了。
圖中紅色框的文件是替換合并后的文件。
將庫導(dǎo)入需要使用的工程中即可。
在工程中新建bundle,iOS-Resource-Setting Bundle 命名bundle,比如Resource.bundle。
創(chuàng)建一個文件夾如:images,將需要放入的圖片拖進去即可,拖進去后Xcode還是未顯示出加入的圖片,可以將bundle取出然后重新添加進去就有了。
項目中導(dǎo)入使用的時候需要配置的編譯參數(shù) Build Settings - Linking - Other Linker Flags ,相關(guān)的介紹附上。
如果靜態(tài)庫中有 category ,那么需要添加 -ObjC 參數(shù)標(biāo)識,否則可能會報: unrecognized selector sent to instance ,因為鏈接器就會把靜態(tài)庫中所有的Objective-C類和分類都加載到最后的可執(zhí)行文件中。
會讓鏈接器把所有找到的目標(biāo)文件都加載到可執(zhí)行文件中,但是千萬不要隨便使用這個參數(shù)!假如你使用了不止一個靜態(tài)庫文件,然后又使用了這個參數(shù),那么你很有可能會遇到 ld: duplicate symbol 錯誤,因為不同的庫文件里面可能會有相同的目標(biāo)文件,所以建議在遇到 -ObjC 失效的情況下使用 -force_load 參數(shù)。
所做的事情跟 -all_load 其實是一樣的,但是 -force_load 需要指定要進行全部加載的庫文件的路徑,這樣的話,你就只是完全加載了一個庫文件,不影響其余庫文件的按需加載
iOS-SDK從無到有(學(xué)有所出,有所記)
配置和使用靜態(tài)庫
iOS之SDK開發(fā)的總結(jié)
iOS 庫.a 和 framework的區(qū)別和創(chuàng)建
iOS SDK開發(fā)就是為某一個應(yīng)用場景、或領(lǐng)域、或需求,提供一個已實現(xiàn)的、封裝好的、可供直接使用的模塊。
其主要由兩部分組成:用來為類型或常量聲明的頭文件列表、具體實現(xiàn)的二進制文件。
所以SDK開發(fā)中的主要問題點集中在:
1. 頭文件是否能被使用的工程索引到
2. 二進制文件是否能被使用的工程搜索到
本篇文章不寫制作SDK的具體步驟,僅僅討論制作SDK時的一些情形。
SDK開發(fā)中關(guān)于頭文件設(shè)置:
凡是提供給外界使用的類、結(jié)構(gòu)體、枚舉、常量等,定義它們的頭文件必須要在工程的Build Phases-Headers-public下面。并且這些頭文件都需要包含在與SDK工程同名的頭文件中(這條不是必須,只是這么做會顯得更加規(guī)范。別人使用SDK的時候,只需要引入SDK同名的頭文件即可)
設(shè)置庫文件生成動態(tài)的還是靜態(tài)的:
Project Name-Target Name-Build Settings-搜索框搜“Mach”-修改“Mach-O Type”為動態(tài)或靜態(tài),則相應(yīng)可生成動態(tài)或靜態(tài)的庫文件。
先解釋說明以下圖片中出現(xiàn)的工程名字:
SDKDemo :制作的向外提供的SDK庫文件(與SDK工程名同名)
SDKApp :引用SDK庫文件(本文指的是SDKDemo)的App工程
SDKStatic :新建工程時,選擇iOS-Framework Library-Cocoa Touch Static Library. 用來生成.a文件的工程
SDKFramework : ?是個Framework庫文件(可能是動態(tài)的,也可能是靜態(tài)的),用于模擬被SDK依賴的.framework文件
下面分幾種情況來討論SDK開發(fā)的注意事項:
1. 生成動態(tài)SDK庫文件。
創(chuàng)建工程的時候,根據(jù)默認配置編譯是生成動態(tài)庫的。
App工程中引入動態(tài)庫的時候,需要在
App工程:Project Name-Target Name-General-Embedded Binaries下添加引入的動態(tài)庫。否則運行時會報如下類型錯誤:
嵌入動態(tài)庫編譯后,生成的App文件中會多一個Frameworks目錄(可右鍵.App文件查看包內(nèi)容),里面全是Embedded Binaries下添加的動態(tài)庫
2. 打包為靜態(tài)庫
SDK工程:Project Name-Target Name-Build Settings-搜索框搜“Mach”-修改“Mach-O Type”為靜態(tài)庫
App工程引入靜態(tài)庫很簡單,直接引入就行,不需要額外配置:
tips:
合并真機與模擬器版本時的命令格式為:
lipo -create?模擬器版本的路徑?真機版本的路徑 -output 合并后的版本存放路徑
1. 合并時lipo -create接收的模擬器版本和真機版本兩個參數(shù)的前后順序沒有關(guān)系,合并后的版本通過命令查看架構(gòu)信息顯示結(jié)果是完全一致的。模擬器架構(gòu)信息顯示在前,真機架構(gòu)信息在后。
2. 合并后的版本無論替換真機版本的Framework中的目標(biāo)文件還是模擬器版本的Framework中的目標(biāo)文件,App工程中引入被替換的Framework后在真機和模擬器上都能跑起來
首先創(chuàng)建SDKStatic工程,生成一個.a文件。
該工程只是簡單繼承了UIButton,并重寫了initWithFrame方法。為每一個MyButton對象默認生成標(biāo)題和背景色:
生成的.a文件如下,可以看到里面包含了MyButton.o文件:
在SDK工程中引入.a文件。下面分兩種情況來看生成的SDK庫文件:
1. SDK庫文件做成動態(tài)庫(設(shè)置方法看開頭部分)
.a文件內(nèi)容被整合進了SDK動態(tài)庫文件中,引入App工程中時,只需要引入SDK動態(tài)庫就可以了
2. SDK庫文件做成靜態(tài)庫(設(shè)置方法看開頭部分)
包中的信息:
.a文件內(nèi)容同樣被整合進了SDK靜態(tài)庫文件中,這個更好理解。引入App工程中時,只需要引入SDK靜態(tài)庫就可以了
總結(jié)下:
制作SDK庫時,如果有依賴的.a文件,則最終生成的SDK庫文件會合并.a文件的內(nèi)容,而不論SDK庫文件是動態(tài)還是靜態(tài)的。
下面的SDKFramework是個Framework庫文件(可能是動態(tài)的,也可能是靜態(tài)的)
SDKFramework工程添加的內(nèi)容和SDKStatic工程是一樣的。也是自定義MyButton,默認生成標(biāo)題和背景色(拷貝文件到工程):
SDKDemo工程自定義了MyView,默認生成的MyView對象添加了一個MyButton按鈕和背景色:
1. 如果.framework文件是動態(tài)庫
a. SDK打包為靜態(tài)庫,如下:
靜態(tài)SDK包和動態(tài)SDKFramework.framework文件是彼此獨立的。引入靜態(tài)SDK包時,必須也導(dǎo)入SDKFramework.framework,否則編譯不過,因為靜態(tài)包有引入動態(tài)庫中的符號。
b. SDK打包為動態(tài)庫,如下:
兩者還是彼此獨立的。動態(tài)SDK包中會記錄依賴的動態(tài).framework rpath,App運行時,dyld會根據(jù)這個信息去加載對應(yīng)的.framework依賴文件。如果找不到App將會在啟動時奔潰...
2. 如果.framework文件是靜態(tài)庫
a. 首先SDK打包為動態(tài)庫看看:
經(jīng)實踐,依賴的靜態(tài)庫會被整合進動態(tài)SDK包自身中。App中引入時,只需要導(dǎo)入SDK包就可以。我們在SDKApp中導(dǎo)入SDKDemo,運行可以看到如下效果:
b. 再看看SDK打包為靜態(tài)庫:
根據(jù)上面截圖中信息,App中導(dǎo)入SDK包時,也必須導(dǎo)入依賴的.framework了。否則編譯時將會出現(xiàn)如下圖所示找不到符號的錯誤:
追加導(dǎo)入依賴的.framework,再次編譯運行。OK!!!
總結(jié):
1. 依賴的.framework為動態(tài)庫
制作的SDK庫文件不論動態(tài)還是靜態(tài)的。和依賴的.framework文件本身是彼此獨立的,不會發(fā)生符號整合的現(xiàn)象
2.?依賴的.framework為靜態(tài)庫
如果制作的SDK庫文件是動態(tài)的,則依賴的.framework靜態(tài)庫內(nèi)容會被整合進SDK庫文件中
如果制作的SDK庫文件是靜態(tài)的,則彼此是獨立的
這里又得分幾種情況討論:
1. Podfile中不使用use_frameworks! ?pods庫生成的是.a文件
a. 如果SDK制作成靜態(tài)庫:
? SDK靜態(tài)庫不會整合Pods里三方庫中的符號,最終導(dǎo)入App工程時,需要SDK靜態(tài)庫、Pods中的三方庫文件一起導(dǎo)入
b. 如果SDK制作成動態(tài)庫:
? Pods庫中的符號會被合并整合進入SDK庫中,導(dǎo)入工程時,只需要導(dǎo)入SDK包就OK了
2. Podfile中使用use_frameworks! ?pods庫生成的是.framework文件。其中Pods_工程名.framework文件是個靜態(tài)庫,管理的第三方庫生成的是framework動態(tài)庫
a.如果SDK制作成動態(tài)庫:
SDK中會包含引入三方庫的rpath,App中引入SDK包時,也必須引入三方庫,否則dyld加載不了指定庫導(dǎo)致App啟動時奔潰
b. 如果SDK制作成靜態(tài)庫:
靜態(tài)SDK中會忽略Pods中的庫中定義的符號(也即彼此是獨立的)。如果靜態(tài)SDK中引用了動態(tài)pods庫中定義的符號,只要在App工程中也導(dǎo)入pods中動態(tài)庫,并在embeded binaries中添加。一樣是可以編譯運行的。
其實怎么編譯,SDK工程中是個什么情形都不重要。重要的是要明白庫文件的本質(zhì),及它是如何發(fā)揮作用的?在什么階段發(fā)揮作用?然后學(xué)會查看編譯運行時的報錯信息,并配合使用otool、nm、lipo、ar、file等這些命令去查看庫文件的一些信息,最終追蹤定位到問題。
原諒我最后都沒怎么貼圖了,因為流程都和前面差不多。我也寫的手累了。如果你還有什么疑惑可以在下面評論,我會盡量及時回復(fù)。
網(wǎng)頁題目:ios如何開發(fā)sdk,ios開發(fā)做什么
當(dāng)前URL:http://chinadenli.net/article32/dsehdsc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、域名注冊、全網(wǎng)營銷推廣、靜態(tài)網(wǎng)站、App設(shè)計、搜索引擎優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)