xcode制作iOS靜態(tài)庫(kù)SDK<包含第三方.a或者.framework靜態(tài)庫(kù)>

原本不打算發(fā)一篇這個(gè)的,應(yīng)該是包含在這篇Flash Air ANE for iOS 集成最新版本的友盟統(tǒng)計(jì)SDK.framework功能中的,但是由于ANE的開(kāi)發(fā)需求一般太少,這個(gè)靜態(tài)庫(kù)如何包含第三方SDK靜態(tài)庫(kù)又是我在開(kāi)發(fā)ANE擴(kuò)展庫(kù)中遇到的一個(gè)大問(wèn)題,折騰了好幾天才解決了這個(gè)問(wèn)題。而且網(wǎng)上問(wèn)的人很多,且大多都沒(méi)有給出解決方案,所以還是單獨(dú)拎出一篇記錄一下。
制作工具xcode版本 8.2.1

一. 簡(jiǎn)單介紹

一般制作靜態(tài)庫(kù)的方法及靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的詳細(xì)介紹,偷個(gè)懶借鑒一下別人的iOS靜態(tài)庫(kù)SDK制作,我覺(jué)得這篇不管從原理還是制作方法說(shuō)的都是很詳細(xì)的。32個(gè)贊!


二. 使用.a文件制作靜態(tài)庫(kù)

在<一>的基礎(chǔ)上我們可能有額外的兩個(gè)需求:1就是將第三方的靜態(tài)庫(kù)(*.a)打包進(jìn)我們自己的靜態(tài)庫(kù)中,2.將第三方靜態(tài)庫(kù)(.framework)打包進(jìn)我們自己的靜態(tài)庫(kù)中。首先來(lái)說(shuō)一下1的實(shí)現(xiàn)方式,我們以百度統(tǒng)計(jì)的SDK為例子,將百度統(tǒng)計(jì)的功能集成到我們自己的靜態(tài)庫(kù)中去:

2.1 創(chuàng)建一個(gè)靜態(tài)庫(kù)項(xiàng)目,選擇Static Library (生成.a的靜態(tài)庫(kù),如果選擇Framework即生成.framework的靜態(tài)庫(kù)也可以是動(dòng)態(tài)庫(kù) 具體怎么區(qū)分請(qǐng)參見(jiàn)<1.>)


2.1-1.png

2.2將靜態(tài)庫(kù)拖入到項(xiàng)目中,并勾選Add to Targets到庫(kù)中。


2.2-1.png

2.2-2.png

2.3 添加百度SDK所需要依賴(lài)的系統(tǒng)庫(kù),這里添加的.dylib如果使用新的.tbd編譯會(huì)報(bào)錯(cuò),簡(jiǎn)單的處理就是還替換添加.dylib的庫(kù)<在Link Binary withLibaraies中點(diǎn)擊加號(hào)->Add Other...->Shift + Command + G組合鍵->輸入/usr/lib->找到需要添加的庫(kù) 如圖 2,3>


2.3-1

2.3-2

2.3-3

2.4 設(shè)置Build setting如下
2.4-1

2.5 分別設(shè)置編譯庫(kù)運(yùn)行環(huán)境Debug/Release,并分別選擇編譯Target Device為模擬器/Generic iOS device,運(yùn)行生成兩個(gè)版本的靜態(tài)庫(kù).a文件:


2.5-1

2.5-2

2.5-3

2.5-4

2.5-5

2.6 通過(guò)lipo -create //debug.a //release.a -output universal.a命令將兩個(gè)靜態(tài)庫(kù)合成一個(gè)靜態(tài)庫(kù)適用于不同的編譯環(huán)境:這就制作完成了可以用了。

2.5-1

2.5-2


三.Framework、.a、.dylib/.tbd三種格式的說(shuō)明

另外一種情況比較特殊的情況就是將第三方的.framework的庫(kù)包含進(jìn)我們的靜態(tài)庫(kù)中,首先了解一下.framework和.a的靜態(tài)庫(kù)之間的區(qū)別:

  1. Framework
    Framework的英文釋意是框架,主要由Headers、binary文件、.bundle這三部分構(gòu)成,除此之外還有Info.plist和Modules,后兩者主要記錄Framework的版本之類(lèi)的信息,一般都會(huì)刪掉,不做討論

a).Headers
包含我們?cè)谥谱鱂ramework的時(shí)候暴露的頭文件,所有被暴露的.h都放在這里。
b).binary文件
整個(gè)Framework的核心,所有代碼都被編譯成了這樣一坨二進(jìn)制文件,這里要注意的是添加的依賴(lài)庫(kù)不會(huì)被編譯進(jìn)來(lái),用的時(shí)候還需要重新link其他依賴(lài)庫(kù)。
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)庫(kù)也可以是動(dòng)態(tài)庫(kù),這取決于編譯成的Mach-O(就是那個(gè)二進(jìn)制文件)是動(dòng)態(tài)庫(kù)還是靜態(tài)庫(kù),F(xiàn)ramework本質(zhì)上并不是一個(gè)庫(kù),它是蘋(píng)果為了方便開(kāi)發(fā)者提供了一種庫(kù)的打包方式,F(xiàn)ramework會(huì)將Mach-O文件、頭文件和資源包全都包含進(jìn)來(lái),不需要你再手動(dòng)整理,我們也可以通過(guò)Xcode來(lái)制作framework動(dòng)態(tài)庫(kù)使用。
所以總結(jié):Framework是庫(kù)的打包形式,既可以是動(dòng)態(tài)庫(kù)也是靜態(tài)庫(kù)。

  1. .a靜態(tài)庫(kù)
    這類(lèi)靜態(tài)庫(kù)與Framework基本類(lèi)似,不同的是在打包成.a文件的同時(shí),還需要提供頭文件,使用時(shí)相較于Framework比較麻煩,(例如微信支付SDK使用的是.a,不同的是支付寶SDK是以framework的形式打包的)。.a這樣打包不夠方便,而Framework編譯完成暴露的頭文件都已經(jīng)放好了。
  1. .dylib/.tbd 動(dòng)態(tài)庫(kù)
    這類(lèi)動(dòng)態(tài)庫(kù)我們也經(jīng)常用,基本上都是系統(tǒng)提供的,一般不能自己制作,就算你通過(guò)其他方式制作使用,也肯定不能上架的,這里沒(méi)什么好講的。
  1. ** 如果將第三方SDK的framework包含在自己的靜態(tài)庫(kù)中,一種方法就是打包的時(shí)候不打包進(jìn)自己的靜態(tài)庫(kù)中,然后在調(diào)用靜態(tài)庫(kù)的時(shí)候再在程序中引入第三方的SDK即可**,iOS靜態(tài)庫(kù)SDK制作也有提到具體如何操作,.framewrok的庫(kù)確實(shí)無(wú)法整體直接打包進(jìn)靜態(tài)庫(kù)中。沒(méi)有辦法直接整體打包,那么有沒(méi)有辦法間接的引入呢?

四.艱辛路程

因?yàn)槲覀児居幸粋€(gè)外包的Flash Air跨平臺(tái)的游戲項(xiàng)目<安卓,iOS,Windows>,公司想集成一個(gè)App統(tǒng)計(jì)的功能,統(tǒng)計(jì)一下用戶(hù)數(shù)量活躍度之類(lèi)的。這時(shí)候需要用到一個(gè)ANE擴(kuò)展庫(kù)的功能,具體干嘛的有興趣的可以去百度上Google一下,如果也有這方面的需求可以參考我的另一篇:Flash Air ANE for iOS 集成最新版本的友盟統(tǒng)計(jì)SDK.framework功能,簡(jiǎn)單來(lái)說(shuō)就是通過(guò)在Air端提供的橋接接口,在Air端通過(guò)調(diào)用橋接的接口間接調(diào)用iOS端庫(kù)中的方法,實(shí)現(xiàn)方式類(lèi)似與OC的代理方法一樣。

  1. 我們?cè)谡{(diào)研的時(shí)候遇到的問(wèn)題

a).現(xiàn)在主流的第三方都不在提供ANE的擴(kuò)展庫(kù),這意味著你想用的話必須自己去生成<ShareSDK 還有提供>。
b).現(xiàn)在網(wǎng)上有關(guān)ANE的資料大多都比較老大多停留在14年左右,GitHub上的庫(kù)基本都是13 14年的,也能依稀看的到Flash Air開(kāi)發(fā)逐漸的沒(méi)落。
c).開(kāi)發(fā)上遇到的難題:因?yàn)橹谱鱝ne需要兩個(gè)最重要的文件一個(gè)是.a的靜態(tài)庫(kù)一個(gè)是Flash制作的接口swc文件,.a的庫(kù)是需要封裝好第三方的功能,因?yàn)槲覀児窘y(tǒng)一使用的是友盟的,而友盟新版本的SDK已經(jīng)變成.framework的形式,而且我問(wèn)了他們客服,已經(jīng)不提供.a的靜態(tài)庫(kù)了。經(jīng)過(guò)幾天的折騰發(fā)現(xiàn)確實(shí)只能將.a的靜態(tài)庫(kù)包含進(jìn)ANE的擴(kuò)展庫(kù)中,而使用.framework是無(wú)法包含進(jìn)去的<至少是我自己調(diào)研出來(lái)的結(jié)果,有些方法確實(shí)可以將framework打包進(jìn)ane中,但是API接口無(wú)法調(diào)用>。所以就遇到了頭疼的問(wèn)題,怎么把別人的framework打包進(jìn)我的.a靜態(tài)庫(kù)中?然后我才能去合成我的ane擴(kuò)展庫(kù)。

  1. 通過(guò)framework的介紹:Framework的英文釋意是框架,主要由Headers、binary文件、.bundle這三部分構(gòu)成,其實(shí)framework就是在.a靜態(tài)庫(kù)基礎(chǔ)上的更上一層封裝,包含了資源,二進(jìn)制文件,和頭文件并生成統(tǒng)一格式方便用戶(hù)調(diào)用有點(diǎn)類(lèi)似<.dylib和.tbd>,并不是重新生成的另外一種形式,只是對(duì)老的格式進(jìn)行了一層更規(guī)范的封裝,統(tǒng)一管理資源文件 頭文件和庫(kù)的二進(jìn)制文件。所以如果你需要的.a文件其實(shí)就在.framework文件中,以友盟為例:手動(dòng)把二進(jìn)制文件改成.a的后綴,帶上頭文件,然后調(diào)用他吧...
    4.2-1
  1. 所以想要把framework打包進(jìn)你的靜態(tài)庫(kù)中去的話,你只需要兩步->四.2->


. 正文



五. 將第三方.framework集成到自己的靜態(tài)庫(kù)里

好像直接指定步驟很多人做出來(lái)的靜態(tài)庫(kù)不能用>_<...,所以我還是來(lái)把將第三方.framework集成到自己的靜態(tài)庫(kù)里寫(xiě)一個(gè)完整的流程吧。大家對(duì)照做看看有哪些步驟做錯(cuò)了。

1 .這里我已友盟的SDK作為例子,首先去友盟官網(wǎng)下載最新版本的SDK 友盟官網(wǎng),解壓根據(jù)如下路徑找到二進(jìn)制文件

1.png

2 . 將UMMobClick的二進(jìn)制文件改成.a的后綴名,并且拖到Header里,順便給Header改個(gè)響亮的名字UMMobClick

2.png

3 .開(kāi)始制作我們自己的靜態(tài)庫(kù)的項(xiàng)目,將UMMobClick文件夾拖進(jìn)項(xiàng)目里面,注意勾選Coby...和Add to target選項(xiàng),完成之后如下:

3

4.png

5

4 . 導(dǎo)入U(xiǎn)MMobClick的依賴(lài)庫(kù)

6

5 . 寫(xiě)好我們需要調(diào)用的API和實(shí)現(xiàn),這里我只做一個(gè)調(diào)用開(kāi)啟UM統(tǒng)計(jì)的接口和:

7

8

6 .生成我們需要的靜態(tài)庫(kù)文件

1.生成模擬器的靜調(diào)庫(kù),選中一個(gè)模擬器設(shè)置Build Active Architecture Only = NO,設(shè)置Edit Scheme ->Run->Build configuration ->Debug.Command + B編譯生成靜態(tài)庫(kù)


9

10

11

2,同理選中真機(jī),Edit Scheme ->Run->Build configuration ->Release


12.png

7 .合并兩個(gè)版本的靜態(tài)庫(kù):

1.右鍵靜態(tài)庫(kù)->Show in Finder


13

2.將兩個(gè)庫(kù)拖到桌面


14

3.運(yùn)行命令lipo -create /Users/collegepre/Desktop/Products/Debug-iphonesimulator/libUMMobStaticLib.a /Users/collegepre/Desktop/Products/Release-iphoneos/libUMMobStaticLib.a -output libUMMobStaticLib.a
15png

4.將生成的靜態(tài)庫(kù)和頭文件拖入一個(gè)文件夾


16

8 .驗(yàn)貨...

1.創(chuàng)建一個(gè)測(cè)試程序拖入上面創(chuàng)建好的靜態(tài)庫(kù).


17

2.導(dǎo)入依賴(lài)庫(kù)


18.png

3.調(diào)用接口
19

4.運(yùn)行查看結(jié)果


20.png

5.結(jié)果OK,

六.Demo地址

demo地址Demo傳送門(mén)

七.如若轉(zhuǎn)載請(qǐng)注明出處,

如果有不正確的地方歡迎留言指出。

對(duì)你有幫助的話,請(qǐng)點(diǎn)個(gè)贊吧!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容