若是咱們但願與別人共享某些函數,卻又不肯意暴露實現的細節,怎麼辦呢?架構
這時候能夠將咱們的代碼封裝成framework,對外提供接口而不暴露實現;app
不只如此,將代碼整合成framework還有不少其餘的好處,這裏就不一一列舉。iphone
下面就來看看如何打包成 framework 吧。函數
一、 建立工程測試
經過OS X > Framework&Library > Bundle 建立工程:ui
二、添加 Headersspa
在 Build Phases 中添加 Headers:.net
Headers 展開後是這樣的:code
三、添加項目代碼接口
將須要封裝打包的文件加入項目中,這裏最好用 copy 的方式加入:
四、合併頭文件
爲了方便別人使用 framework,最好建立一個頭文件,而且在頭文件下包含你全部想要公開的類,如此,當別人使用你的 framework 時只須要導入這一個頭文件就能夠了。
五、公開類
當代碼加入了項目後,全部的 .h 文件都會自動出如今 Headers 的 Project 下面,而後,咱們將須要公開的類拖到 Public 下面。
這裏須要注意:Private 仍然是公開的而不是私有的,不要被它的名字誤導了,私有類保留在 Project 下就好。
六、更改一些設置:
6.1 info.plist > Bundle OS Type code = FMWK
6.2 Build Settings > Base SDK = Latest iOS,選擇最新的
6.3 Build Settings > Linking :
Dead Code Stripping = NO;
Link With Standard Libraries = NO;
Mach-O Type = Static Library.
對於Mach-O Type可能有兩種狀況:(1)選擇 Static Library 打出來的是靜態庫;(2)選擇 Relocatable Object File 打出來是動態庫。
這裏建議使用靜態庫,動態庫在提交 AppStore 審覈的時候貌似會被拒;可是網上看了一些資料說動態庫也是能夠的,不過會有一些機審的規則須要注意下,好比不要把x86/i386的包和arm架構的包lipo在一塊兒,就單純使用真機包。(關於這個沒有測試過,也不知道是否是真的,若是有朋友測試過的但願告知下,謝謝!)
6.4 Build Settings > Packaging > Wrapper Extension = framework.
七、修改輸出路徑
7.1 爲了方便找到運行後生成的framework,咱們提早在項目目錄下建立一個目錄 build,用來存放運行後生成的文件;
7.2 而後,須要修改下輸出路徑:
Build Settings > Per-configuration Build Products Path = $(SRCROOT)/build/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
八、編譯
8.1 選擇 Generic iOS Device, 編譯;
8.2 選擇模擬器,編譯。
8.3 編譯成功後,會在 build 下產生2個文件夾,一個是 device 編譯生成的,一個是 simulator 編譯生成的,他們裏面存放着對應的 framework。
九、合併
此時,已經有了適用於設備和模擬器的2個framework,接下來,須要將他們合併,使其同時適用於設備與模擬器。
9.1 這裏合併的並非2個framework,而是各自的二進制文件,以下圖中的 JJFramework;
9.2 那麼如何合併呢?首先,打開終端,cd 到 build 文件夾;而後輸入命令:
lipo -create 設備二進制文件 模擬器二進制文件 -output 合成文件的名字 ;
注意:(1)注意空格。(2)合成後的文件名字須要和合成前的名字同樣,不然使用framework時會報錯。
如上圖,合併2個 JJFramework 輸入以下命令:
lipo -create Debug-iphoneos/JJFramework.framework/JJFramework Debug-iphonesimulator/JJFramework.framework/JJFramework -output JJFramework。
build 文件夾下的 JJFramework 就是合成後的二進制文件了。
9.3 將設備或模擬器運行生成的framework移出來,用合成的二進制文件替換本來二進制文件:
十、刪除 info.plist
到這裏就基本上大功告成了。
另外,若是framework中沒有用到過 info.plist,能夠將其刪除以避免發生衝突。(我就遇到過一次這坑爹的狀況)
OK, framework打包完成。
其實封裝 framework 有不少種方法,以上只是其中一種;並且應該還有更簡單的方法,有時間的話,後續會補上。