【iOS】如何封裝代碼,打包靜態庫(包含第三方庫)

第一步:

創建個靜態庫工程


創建靜態庫.png
工程文件.png

注意如果有使用到第三方的SDK的,再手動導入時,勾選復制,但記住一定要在下圖標注的刪除:

刪除庫引用.png

然后接下來就是,按照第三方文檔集成第三庫,直至沒有報錯!并可以在自己需要封裝的代碼中可以使用!

第二步:

點擊加號,添加headers標簽,并將需要公開的頭文件放到Pubilc中:如下圖
需要封裝什么代碼只需要工程里面添加.h.m進行實現,跟我們平時完成項目一樣的,把需要暴露的.h加入到下圖就行

添加headers.png

如果你需要打成靜態庫的文件中有拓展(Categort),那么這個地方other
Linker Flags
要寫入** -ObjC **,如圖

-ObjC.png

第三步

開始打包靜態庫
設置為NO,為了使我們打出來的庫在,真機和模擬器上都能編譯,
(切記,在真機和任意選擇一個模擬器 使用Command + B 都進行預編譯一次!)

Paste_Image.png

合并.a

右鍵顯示在finder,


查找.a.png

如圖,有真機和模擬器的.a文件


真機模擬器.png

使用終端命令合并.a ,請根據實際操作路徑輸入下列終端命令!

lipo -create   真機的.a的路徑  模擬器的.a的路徑   -output    輸出位置路徑.a 


輸出的.a 和暴露的.h拿出來,拷貝到同一個一個文件夾,并將使用到的第三方庫一起在新的工程中進行導入,和根據文檔配置,至此我們的包含第三方庫的靜態庫就算制作成功了,不足之處,敬請指導!

=================== 庫的介紹 ==================

一. 靜態庫和動態庫的詳細介紹

我們平時的工程中或多或少都要引入第三方的SDK,就算你沒有引入第三方的,至少引用過系統的Framework吧?其實這些SDK和Framework都屬于庫,庫又分為靜態庫和動態庫,我們平時導入的第三方SDK有的是Framework,有的是.a,到底哪些是動態庫,哪些是靜態庫呢?下面分別介紹靜態庫、動態庫,Framework和.a以及.dylib/.tbd區別
一. 靜態庫與動態庫
首先要解釋一下什么是庫,庫(Library)其實就是一段編譯好的二進制代碼,加上頭文件就可以供別人使用,一般會有兩種情況要用到庫:
某些代碼需要給別人使用,但是我們不希望別人看到源碼,就需要以庫的形式進行封裝,只暴露出頭文件。
對于某些不會進行大的改動的代碼,比方說很多大公司常用且很少變動的模塊都會編譯成庫,這樣做的好處一是可以節省編譯時間,二來對于代碼的管理也非常方便。
因為庫是已經編譯好的二進制文件了,編譯的時候只需要link一下,既然提到了link那就有不同的形式了,靜態和動態,與之相對應的就是靜態庫和動態庫。

1. 靜態庫

平時我們用的第三方SDK基本上都是靜態庫,靜態庫的幾個特點:
在App項目編譯的時候會被拷貝一份編譯到目標程序中,相當于將靜態庫嵌入了,所以得到的App二進制文件會變大。
在使用的時候,需要手動導入靜態庫所依賴的其他類庫。(比如說某個SDK中使用到了CoreMotion.framework,在使用的時候需要手動導入。有的SDK需要link十幾個系統庫,這個時候非常惡心,只能一個一個手動加,這是靜態庫一個很大的不便之處。)
導入靜態庫的應用可以減少對外界的依賴,如果導入的是第三方動態庫,動態庫找不到的話應用就會崩掉,例如Linux上經常出現的lib not found。
靜態庫很大的一個優點是減少耦合性,因為靜態庫中是不可以包含其他靜態庫的,使用的時候要另外導入它的依賴庫,最大限度的保證了每一個靜態庫都是獨立的,不會重復引用。

2. 動態庫

這個是我們最常用的一類庫,使用頻率最高的UIKit.framework和Fundation.framework都屬于動態庫,所有.dylib和.tbd結尾的都屬于動態庫。動態庫的幾個特點:
平時使用的系統庫都放在iOS系統中,在你打包應用程序的時候這些庫不會拷貝到你的程序中,當需要使用的時候會動態從iOS系統中加載它們,因為這個原因,動態庫也被稱作共享庫。編譯時才載入的特性,也可以讓我們隨時對庫進行替換,而不需要重新編譯代碼。
這些庫是所有應用公用的,換一種說法就是節省了應用安裝包的體積,這是區別靜態庫很重要的一個特點,因為靜態庫使用一次就要拷貝一次,非常浪費資源。
動態庫在制作的時候可以直接包含靜態庫,也能自動link所需要的依賴庫。
使用動態庫的時候不需要再次link依賴庫,即導即用,這個就厲害了。唯一需要注意的是在導入自己制作的動態庫時,需要在Embedded Binaries中導入,不然會報錯:image not found。此時這個動態庫會跟靜態庫一樣被拷貝到目標程序中進行編譯,蘋果又把這種Framework叫做Embedded Framework
關于動態庫要搞清楚一點,我們自己制作的動態庫與系統動態庫的區別,我們自己制作的動態庫引入App項目的時候需要embed進項目,也就是要拷貝到目標程序中,這就有點不像動態庫的特性了,蘋果這么做也是考慮安全問題吧!至于能不能正常上架,我也不清楚,查了大量資料都是抄來抄去沒說清楚,我猜測是不能上架的,因為一般的第三方SDK也都是靜態庫的形式,我猜測一個重要原因是iOS的應用本來就是運行在沙盒里面的,不同應用之間不能共享代碼,同時動態下載代碼蘋果肯定也是明令禁止的,所以動態庫也就失去意義了。當然可能還有其他因素,歡迎交流學習!

二. Framework、.a、.dylib/.tbd

1. Framework

Framework的英文釋意是框架,主要由Headers、binary文件、.bundle這三部分構成,除此之外還有Info.plist和Modules,后兩者主要記錄Framework的版本之類的信息,一般都會刪掉,不做討論
Headers包含我們在制作Framework的時候暴露的頭文件,所有被暴露的.h都放在這里。
binary文件整個Framework的核心,所有代碼都被編譯成了這樣一坨二進制文件,這里要注意的是添加的依賴庫不會被編譯進來,用的時候還需要重新link其他依賴庫。
.bundle資源文件都打包放在這里。在制作Framework的時候不可以把圖片直接放在項目中,否則制作好之后圖片是一張一張的出現在項目中非常亂,需要新建一個bundle將圖片放進去,這里的bundle提供整個SDK的圖片資源。注意:圖片放進bundle之后不可以用[UIImage ImageWithName:]
讀取圖片。要先找到bundle包再拿圖片。

這里要糾正一個誤區
很多人認為系統的Framework就是動態庫,我們自己制作的Framework就是靜態庫。
其實Framework既可以是靜態庫也可以是動態庫,這取決于編譯成的Mach-O(就是那個二進制文件)是動態庫還是靜態庫,Framework本質上并不是一個庫,它是蘋果為了方便開發者提供了一種庫的打包方式,Framework會將Mach-O文件、頭文件和資源包全都包含進來,不需要你再手動整理,我們也可以通過Xcode來制作framework動態庫使用。所以總結: Framework是庫的打包形式,既可以是動態庫也是靜態庫。

2. .a靜態庫

這類靜態庫與Framework基本類似,不同的是在打包成.a文件的同時,還需要提供頭文件,使用時相較于Framework比較麻煩,(例如微信支付SDK使用的是.a,不同的是支付寶SDK是以framework的形式打包的)。.a這樣打包不夠方便,而Framework編譯完成暴露的頭文件都已經放好了。

3. .dylib/.tbd 動態庫

這類動態庫我們也經常用,基本上都是系統提供的,一般不能自己制作,就算你通過其他方式制作使用,也肯定不能上架的,這里沒什么好講的。
二. Framework(靜態庫+動態庫)的制作
動態庫與靜態庫的制作流程基本一樣,包括頭文件的暴露等,唯一不同的是Mach-O文件的編譯形式。本節將介紹Xcode制作Framework的過程,本次制作的Framework靜態庫依賴其他第三方靜態庫(Framework和.a)。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,663評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,125評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,506評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,614評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,402評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,934評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,021評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,168評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,690評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,596評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,288評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,027評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,404評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,662評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,398評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,743評論 2 370

推薦閱讀更多精彩內容