1.介紹
- 原本不打算在分開發(fā)一遍這個(gè)的,應(yīng)該是包含在這篇Flash Air ANE for iOS 集成最新版本的友盟統(tǒng)計(jì)SDK.framework功能中的,但是由于ANE的開發(fā)需求一般太少,這個(gè)靜態(tài)庫如何包含第三方SDK靜態(tài)庫又是我在開發(fā)ANE擴(kuò)展庫中遇到的一個(gè)大問題,折騰了好幾天才解決了這個(gè)問題速梗。而且網(wǎng)上問的人很多,且大多都沒有給出解決方案,所以還是單獨(dú)拎出一篇記錄一下刑桑。
- 一般制作靜態(tài)庫的方法及靜態(tài)庫和動(dòng)態(tài)庫的詳細(xì)介紹,偷個(gè)懶借鑒一下別人的iOS靜態(tài)庫SDK制作,我覺得這篇不管從原理還是制作方法說的都是很詳細(xì)的远豺。32個(gè)贊!
2.工具
Xcode 8.2.1
3.需求
需求一英支、將第三方的靜態(tài)庫(*.a)打包進(jìn)我們自己的靜態(tài)庫中
需求二、將第三方靜態(tài)庫(.framework)打包進(jìn)我們自己的靜態(tài)庫中
需求一
我們以百度統(tǒng)計(jì)SDK為例子,將百度統(tǒng)計(jì)的功能集成到我們自己的靜態(tài)庫中去:
3.1 創(chuàng)建一個(gè)靜態(tài)庫項(xiàng)目蒂阱,選擇Static Library (生成.a的靜態(tài)庫,如果選擇Framework即生成.framework的靜態(tài)庫也可以是動(dòng)態(tài)庫 )
3.2 將靜態(tài)庫拖入到項(xiàng)目中靶溜,并勾選Add to Targets到庫中眯杏。
3.3 添加百度SDK所需要依賴的系統(tǒng)庫夜焦,這里添加的.dylib如果使用新的.tbd編譯會(huì)報(bào)錯(cuò),簡(jiǎn)單的處理就是還替換添加.dylib的庫<在Link Binary withLibaraies中點(diǎn)擊加號(hào)->Add Other...->Shift + Command + G組合鍵->輸入/usr/lib->找到需要添加的庫 如圖 2,3>
3.4 設(shè)置Build setting如下
3.5 分別設(shè)置編譯庫運(yùn)行環(huán)境Debug/Release,并分別選擇編譯Target Device為模擬器/Generic iOS device,運(yùn)行生成兩個(gè)版本的靜態(tài)庫.a文件:
3.6 靜態(tài)庫合并:通過lipo -create //debug.a //release.a -output universal.a命令將兩個(gè)靜態(tài)庫合成一個(gè)靜態(tài)庫適用于不同的編譯環(huán)境:這就制作完成了可以用了岂贩。
需求二
將第三方的.framework的庫包含進(jìn)我們的靜態(tài)庫中茫经,首先了解一下.framework和.a的靜態(tài)庫之間的區(qū)別借用:
Framework
Framework的英文釋意是框架,主要由Headers萎津、binary文件卸伞、.bundle這三部分構(gòu)成,除此之外還有Info.plist和Modules锉屈,后兩者主要記錄Framework的版本之類的信息荤傲,一般都會(huì)刪掉,不做討論
a).Headers
包含我們?cè)谥谱鱂ramework的時(shí)候暴露的頭文件颈渊,所有被暴露的.h都放在這里遂黍。
b).binary文件
整個(gè)Framework的核心,所有代碼都被編譯成了這樣一坨二進(jìn)制文件俊嗽,這里要注意的是添加的依賴庫不會(huì)被編譯進(jìn)來雾家,用的時(shí)候還需要重新link其他依賴庫。
c).bundle
資源文件都打包放在這里绍豁。在制作Framework的時(shí)候不可以把圖片直接放在項(xiàng)目中芯咧,否則制作好之后圖片是一張一張的出現(xiàn)在項(xiàng)目中非常亂,需要新建一個(gè)bundle將圖片放進(jìn)去竹揍,這里的bundle提供整個(gè)SDK的圖片資源敬飒。
注意:圖片放進(jìn)bundle之后不可以用[UIImage ImageWithName:]讀取圖片。要先找到bundle包再拿圖片鬼佣。
其實(shí)Framework既可以是靜態(tài)庫也可以是動(dòng)態(tài)庫驶拱,這取決于編譯成的Mach-O(就是那個(gè)二進(jìn)制文件)是動(dòng)態(tài)庫還是靜態(tài)庫,F(xiàn)ramework本質(zhì)上并不是一個(gè)庫晶衷,它是蘋果為了方便開發(fā)者提供了一種庫的打包方式蓝纲,F(xiàn)ramework會(huì)將Mach-O文件阴孟、頭文件和資源包全都包含進(jìn)來,不需要你再手動(dòng)整理税迷,我們也可以通過Xcode來制作framework動(dòng)態(tài)庫使用永丝。
所以總結(jié):Framework是庫的打包形式,既可以是動(dòng)態(tài)庫也是靜態(tài)庫箭养。
.a靜態(tài)庫
這類靜態(tài)庫與Framework基本類似慕嚷,不同的是在打包成.a文件的同時(shí),還需要提供頭文件毕泌,使用時(shí)相較于Framework比較麻煩喝检,(例如微信支付SDK使用的是.a,不同的是支付寶SDK是以framework的形式打包的)撼泛。.a這樣打包不夠方便挠说,而Framework編譯完成暴露的頭文件都已經(jīng)放好了。
.dylib/.tbd 動(dòng)態(tài)庫
這類動(dòng)態(tài)庫我們也經(jīng)常用愿题,基本上都是系統(tǒng)提供的损俭,一般不能自己制作,就算你通過其他方式制作使用潘酗,也肯定不能上架的杆兵,這里沒什么好講的。
其它
** 如果將第三方SDK的framework包含在自己的靜態(tài)庫中一種方法就是打包不打包進(jìn)自己的靜態(tài)庫中然后在調(diào)用靜態(tài)庫的時(shí)候再在程序中引入第三方的SDK即可**仔夺,iOS靜態(tài)庫SDK制作也有提到具體如何操作琐脏,.framewrok的庫確實(shí)無法整體直接打包進(jìn)靜態(tài)庫中。沒有辦法直接整體打包那么有沒有辦法間接的引入呢缸兔?
4.將第三方.framework集成到自己的靜態(tài)庫里寫一個(gè)完整的流程.
這里我已友盟的SDK作為例子,首先去友盟官網(wǎng)下載最新版本的SDK 友盟官網(wǎng)骆膝,解壓根據(jù)如下路徑找到二進(jìn)制文件
將UMMobClick的二進(jìn)制文件改成.a的后綴名,并且拖到Header里灶体,順便給Header改個(gè)響亮的名字UMMobClick
開始制作我們自己的靜態(tài)庫的項(xiàng)目阅签,將UMMobClick文件夾拖進(jìn)項(xiàng)目里面,注意勾選Coby...和Add to target選項(xiàng),完成之后如下:
導(dǎo)入U(xiǎn)MMobClick的依賴庫
寫好我們需要調(diào)用的API和實(shí)現(xiàn),這里我只做一個(gè)調(diào)用開啟UM統(tǒng)計(jì)的接口和:
生成我們需要的靜態(tài)庫文件
生成模擬器的靜調(diào)庫蝎抽,選中一個(gè)模擬器設(shè)置Build Active Architecture Only = NO,設(shè)置Edit Scheme ->Run->Build configuration ->Debug.Command + B編譯生成靜態(tài)庫
同理選中真機(jī)政钟,Edit Scheme ->Run->Build configuration ->Release
合并兩個(gè)版本的靜態(tài)庫: