iOS 如何讓不支持的armv7、x86_64的SDK支持這些架構(gòu)

背景:最近公司的App需要接個小型打印機,有三方提供iOS/Android的SDK。

當我拿到SDK,拉到原生工程,模擬器運行報錯(Building for iOS simulator, but the linked library xxx.a was built for iOS)。

WeChat0430cd3e2624e0e847b75abb06474a42.png

原生工程寫了很多功能,為了接個業(yè)務(wù)以后都要連接手機調(diào)試,想想都難受,和三方溝通后的回復(fù),這個必須連真機,我建議做個兼容,模擬器能運行,調(diào)用SDK方法時判斷一下是否是真機,三方回復(fù)最近比較忙,以后有時間再支持,心里頓時有一萬個羊駝在奔騰。

打個支持模擬器的包那么難?

如果每個方法都做兼容確實有點麻煩,既然三方不能提供,為了我能自己調(diào)試方便就想想辦法,能不能生成一個相同的庫,合并到一起。


模擬器的是i386、x86_64,相關(guān)詳盡的知識還需要自行搜索。


于是我自己新建立了一個靜態(tài)庫工程,名字建議和拿到SDK的xxAPI.h文件名相同。


WX20210818-161008@2x.png

工程創(chuàng)建后,我們就發(fā)現(xiàn)工程里有兩個文件xxAPI.h和xxAPI.m。我們把三方提供的xxAPI.h里的方法名全部復(fù)制過來,然后在xxAPI.m也復(fù)制一份,將所有的方法加上大括號,需要有返回值的都返回個對類型的默認值,然后選中模擬器再Command+B,我們要的模擬器庫就出來了,基本就花了5分鐘吧。

WX20210818-163755@2x.png

將xxAPI.a復(fù)制到桌面的test文件夾里,打開終端cd到test文件夾,輸入查看命令:

lipo -info xxAPI.a
// Architectures in the fat file: xxAPI.a are: x86_64

我們將模擬器的庫名這改為xxAPI-simulator.a,然后將三方提供的xxAPI.a也拖到test文件夾,這時候我就開始合并,合并的命令如下:

lipo -create xxAPI-simulator.a xxAPI.a -output lib.a
// 等待命令執(zhí)行完畢

打開test文件夾,就發(fā)現(xiàn)lib.a文件,將這個新出爐的靜態(tài)庫放重新導入到工程,選擇模擬器運行,app成功run起來。

code業(yè)務(wù)好幾天,當我準備打包時發(fā)現(xiàn)報錯,報錯如下:

xx.xcodeproj The linked library 'libxxAPI.a' is missing one or more architectures required by this target: armv7.
'Pods_xx.framework' is missing one or more architectures required by this target: armv7.
WX20210818-170206@2x.png

和三方溝通后得到結(jié)果是三方提供的靜態(tài)庫用了一別的庫不支持armv7,那我們還是自力更生吧。

網(wǎng)上搜索了一下架構(gòu)相關(guān)的如下:目前為止Apple移動設(shè)備默認指令集(2014.8.22)


armv6 設(shè)備: iPhone, iPhone2, iPhone3G, 第一代、第二代 iPod Touch

armv7 設(shè)備: iPhone3GS, iPhone4, iPhone4S, iPad, iPad2, iPad3(The New iPad), iPad mini,iPod Touch 3G, iPod Touch4

armv7s設(shè)備: iPhone5, iPhone5C, iPad4(iPad with Retina Display)

arm64 設(shè)備: iPhone5S, iPad Air, iPad mini2(iPad mini with Retina Display)


網(wǎng)上搜索了很多沒有太詳盡的資料(時間有限),iphone 5s 以后的手機都是arm64架構(gòu)吧。

當前是2021年8月iphone 5s及以前的手機應(yīng)該都淘汰了吧,那么我們就暫時忽略這些設(shè)備,就算有老設(shè)備,至少能安裝上,這個打印業(yè)務(wù)用不了,但其他業(yè)務(wù)可以用?。。。。?/p>

于是我打開靜態(tài)庫工程,將模擬器換成設(shè)備,將打包設(shè)置成armv7然后Command+B,一會兒armv7的包就出來,重復(fù)上面的方法將armv7合并到新生成的庫上,更新原工程里的靜態(tài)庫,打包就正常了。


WX20210818-170457@2x.png

注意:自行編譯支持的架構(gòu)下對應(yīng)方法實體是空的,肯定是達不到三方提供效果,只是為了用起來方便,此方法是個野路子,建議還是三方提供較好。

疑問:最新流行的手機都支持arm64,只支持arm64打包還小,他不香嘛?那我們打包只支持arm64不可以嘛?答:只支持arm64那當然是可以的,不過xcode當前的默認配置是包含armv7的,手動去armv7打包xcode會有提示,既然官有提示那一定有他的道理(暫且不研究),所以支持一下默認配置還是較好的。

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

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

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