如下所涉及的框架和庫只針對iOS而言,不確保在其餘平臺也適用。html
最近因爲公司業務須要,要求封裝一個支付SDK,須要用到微信支付和支付寶,以前作過的Framework沒有依賴其餘第三方的庫因此比較好作,此次有所不一樣;一開始我想把支付寶和微信支付的SDK所有融合進來,折騰一天才發現我以前的想法有不少誤區,這樣是根本行不通的,不過最後仍是封裝成功了,下面把個人經驗分享出來,供有須要的同窗少走彎路。 製做以前最好把功課作足,看看靜態庫和動態庫究竟是什麼東西。ios
轉載請註明出處:來自LeonLei的博客http://www.gaoshilei.com安全
咱們平時的工程中或多或少都要引入第三方的SDK,就算你沒有引入第三方的,至少引用過系統的Framework吧?其實這些SDK和Framework都屬於庫,庫又分爲靜態庫和動態庫,咱們平時導入的第三方SDK有的是Framework,有的是.a,到底哪些是動態庫,哪些是靜態庫呢?下面分別介紹靜態庫、動態庫,Framework和.a以及.dylib/.tbd區別微信
首先要解釋一下什麼是庫,庫(Library)其實就是一段編譯好的二進制代碼,加上頭文件就能夠供別人使用,通常會有兩種狀況要用到庫:app
由於庫是已經編譯好的二進制文件了,編譯的時候只須要link一下,既然提到了link那就有不一樣的形式了,靜態和動態,與之相對應的就是靜態庫和動態庫。框架
平時咱們用的第三方SDK基本上都是靜態庫,靜態庫的幾個特色:學習
這個是咱們最經常使用的一類庫,使用頻率最高的UIKit.framework和Fundation.framework都屬於動態庫,全部.dylib和.tbd結尾的都屬於動態庫。動態庫的幾個特色:測試
關於動態庫要搞清楚一點,咱們本身製做的動態庫與系統動態庫的區別,咱們本身製做的動態庫引入App項目的時候須要embed進項目,也就是要拷貝到目標程序中,這就有點不像動態庫的特性了,蘋果這麼作也是考慮安全問題吧!
至於能不能正常上架,我也不清楚,查了大量資料都是抄來抄去沒說清楚,我猜想是不能上架的,由於通常的第三方SDK也都是靜態庫的形式,我猜想一個重要緣由是iOS的應用原本就是運行在沙盒裏面的,不一樣應用之間不能共享代碼,同時動態下載代碼蘋果確定也是明令禁止的,因此動態庫也就失去意義了。固然可能還有其餘因素,歡迎交流學習!微信支付
Framework的英文釋意是框架,主要由Headers、binary文件、.bundle這三部分構成,除此以外還有Info.plist和Modules,後二者主要記錄Framework的版本之類的信息,通常都會刪掉,不作討論code
[UIImage ImageWithName:]
讀取圖片。要先找到bundle包再拿圖片。這裏要糾正一個誤區
不少人認爲系統的Framework就是動態庫,咱們本身製做的Framework就是靜態庫。
其實Framework既能夠是靜態庫也能夠是動態庫,這取決於編譯成的Mach-O(就是那個二進制文件)是動態庫仍是靜態庫,Framework本質上並非一個庫,它是蘋果爲了方便開發者提供了一種庫的打包方式,Framework會將Mach-O文件、頭文件和資源包全都包含進來,不須要你再手動整理,咱們也能夠經過Xcode來製做framework動態庫使用。 因此總結: Framework是庫的打包形式,既能夠是動態庫也是靜態庫。
這類靜態庫與Framework基本相似,不一樣的是在打包成.a文件的同時,還須要提供頭文件,使用時相較於Framework比較麻煩,(例如微信支付SDK使用的是.a,不一樣的是支付寶SDK是以framework的形式打包的)。.a這樣打包不夠方便,而Framework編譯完成暴露的頭文件都已經放好了。
這類動態庫咱們也常常用,基本上都是系統提供的,通常不能本身製做,就算你經過其餘方式製做使用,也確定不能上架的,這裏沒什麼好講的。
動態庫與靜態庫的製做流程基本同樣,包括頭文件的暴露等,惟一不一樣的是Mach-O文件的編譯形式。本節將介紹Xcode製做Framework的過程,本次製做的Framework靜態庫依賴其餘第三方靜態庫(Framework和.a)。
1> 新建工程
2> 導入全部要打包的文件和其餘第三方靜態庫
正常導入要打包的文件就能夠了,在導入第三方靜態庫的時候要注意,不要選擇添加到target中,若是添加進去要去target裏面把第三方靜態庫刪掉(只需導入,不要添加進target)
3> 項目性質修改
把項目的membership需改成public,不然頭文件暴露將會不正常
4> 暴露頭文件
將頭文件暴露出去,供外界使用,全部的編譯文件都在Project中,須要右擊添加到public裏面
5> 選擇Mach-O的編譯方式
這是最重要的一步,這一步決定咱們製做出來的是靜態庫仍是動態庫,默認選擇的是Dynamic Library,要手動選擇Static Library
6> 編譯
若是你的依賴庫裏面有lib開頭的dylib動態庫,此時應該會報錯
7> tbd動態庫報錯修改
先把原來的.tbd刪掉,而後再次添加,這個時候選擇add other,在彈出的窗口中按快捷鍵shift + command + G 調出finder的前往窗口,輸入/usr/lib,而後添加相應的dylib動態庫
8> 使用
新建一個文件夾,將製做好的靜態庫拷貝出來放進去,再將第三方靜態庫拷貝到相同的文件夾中,此時只要將這個文件夾提供給外界使用就能夠了,這是我寫的測試demo驗證打包好的SDK是否能夠正常使用
若是有問題請在留言區留言,或者郵件給我,互相交流學習!