1.介紹
- 原本不打算在分開發一遍這個的,應該是包含在這篇Flash Air ANE for iOS 集成最新版本的友盟統計SDK.framework功能中的,但是由于ANE的開發需求一般太少,這個靜態庫如何包含第三方SDK靜態庫又是我在開發ANE擴展庫中遇到的一個大問題,折騰了好幾天才解決了這個問題。而且網上問的人很多,且大多都沒有給出解決方案,所以還是單獨拎出一篇記錄一下。
- 一般制作靜態庫的方法及靜態庫和動態庫的詳細介紹,偷個懶借鑒一下別人的iOS靜態庫SDK制作,我覺得這篇不管從原理還是制作方法說的都是很詳細的。32個贊!
2.工具
Xcode 8.2.1
3.需求
需求一、將第三方的靜態庫(*.a)打包進我們自己的靜態庫中
需求二、將第三方靜態庫(.framework)打包進我們自己的靜態庫中
需求一
我們以百度統計SDK為例子,將百度統計的功能集成到我們自己的靜態庫中去:
3.1 創建一個靜態庫項目,選擇Static Library (生成.a的靜態庫,如果選擇Framework即生成.framework的靜態庫也可以是動態庫 )
3.2 將靜態庫拖入到項目中,并勾選Add to Targets到庫中。
3.3 添加百度SDK所需要依賴的系統庫,這里添加的.dylib如果使用新的.tbd編譯會報錯,簡單的處理就是還替換添加.dylib的庫<在Link Binary withLibaraies中點擊加號->Add Other...->Shift + Command + G組合鍵->輸入/usr/lib->找到需要添加的庫 如圖 2,3>
3.4 設置Build setting如下
3.5 分別設置編譯庫運行環境Debug/Release,并分別選擇編譯Target Device為模擬器/Generic iOS device,運行生成兩個版本的靜態庫.a文件:
3.6 靜態庫合并:通過lipo -create //debug.a //release.a -output universal.a命令將兩個靜態庫合成一個靜態庫適用于不同的編譯環境:這就制作完成了可以用了。
需求二
將第三方的.framework的庫包含進我們的靜態庫中,首先了解一下.framework和.a的靜態庫之間的區別借用:
Framework
Framework的英文釋意是框架,主要由Headers、binary文件、.bundle這三部分構成,除此之外還有Info.plist和Modules,后兩者主要記錄Framework的版本之類的信息,一般都會刪掉,不做討論
a).Headers
包含我們在制作Framework的時候暴露的頭文件,所有被暴露的.h都放在這里。
b).binary文件
整個Framework的核心,所有代碼都被編譯成了這樣一坨二進制文件,這里要注意的是添加的依賴庫不會被編譯進來,用的時候還需要重新link其他依賴庫。
c).bundle
資源文件都打包放在這里。在制作Framework的時候不可以把圖片直接放在項目中,否則制作好之后圖片是一張一張的出現在項目中非常亂,需要新建一個bundle將圖片放進去,這里的bundle提供整個SDK的圖片資源。
注意:圖片放進bundle之后不可以用[UIImage ImageWithName:]讀取圖片。要先找到bundle包再拿圖片。
其實Framework既可以是靜態庫也可以是動態庫,這取決于編譯成的Mach-O(就是那個二進制文件)是動態庫還是靜態庫,Framework本質上并不是一個庫,它是蘋果為了方便開發者提供了一種庫的打包方式,Framework會將Mach-O文件、頭文件和資源包全都包含進來,不需要你再手動整理,我們也可以通過Xcode來制作framework動態庫使用。
所以總結:Framework是庫的打包形式,既可以是動態庫也是靜態庫。
.a靜態庫
這類靜態庫與Framework基本類似,不同的是在打包成.a文件的同時,還需要提供頭文件,使用時相較于Framework比較麻煩,(例如微信支付SDK使用的是.a,不同的是支付寶SDK是以framework的形式打包的)。.a這樣打包不夠方便,而Framework編譯完成暴露的頭文件都已經放好了。
.dylib/.tbd 動態庫
這類動態庫我們也經常用,基本上都是系統提供的,一般不能自己制作,就算你通過其他方式制作使用,也肯定不能上架的,這里沒什么好講的。
其它
** 如果將第三方SDK的framework包含在自己的靜態庫中一種方法就是打包不打包進自己的靜態庫中然后在調用靜態庫的時候再在程序中引入第三方的SDK即可**,iOS靜態庫SDK制作也有提到具體如何操作,.framewrok的庫確實無法整體直接打包進靜態庫中。沒有辦法直接整體打包那么有沒有辦法間接的引入呢?
4.將第三方.framework集成到自己的靜態庫里寫一個完整的流程.
這里我已友盟的SDK作為例子,首先去友盟官網下載最新版本的SDK 友盟官網,解壓根據如下路徑找到二進制文件
將UMMobClick的二進制文件改成.a的后綴名,并且拖到Header里,順便給Header改個響亮的名字UMMobClick
開始制作我們自己的靜態庫的項目,將UMMobClick文件夾拖進項目里面,注意勾選Coby...和Add to target選項,完成之后如下:
導入UMMobClick的依賴庫
寫好我們需要調用的API和實現,這里我只做一個調用開啟UM統計的接口和:
生成我們需要的靜態庫文件
生成模擬器的靜調庫,選中一個模擬器設置Build Active Architecture Only = NO,設置Edit Scheme ->Run->Build configuration ->Debug.Command + B編譯生成靜態庫
同理選中真機,Edit Scheme ->Run->Build configuration ->Release
合并兩個版本的靜態庫: