第一步:
創建個靜態庫工程
創建靜態庫.png
注意如果有使用到第三方的SDK的,再手動導入時,勾選復制,但記住一定要在下圖標注的刪除:
然后接下來就是,按照第三方文檔集成第三庫,直至沒有報錯!并可以在自己需要封裝的代碼中可以使用!
第二步:
點擊加號,添加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)。