背景:最近公司的App需要接個小型打印機,有三方提供iOS/Android的SDK。
當我拿到SDK,拉到原生工程,模擬器運行報錯(Building for iOS simulator, but the linked library xxx.a was built for iOS)。

原生工程寫了很多功能,為了接個業(yè)務(wù)以后都要連接手機調(diào)試,想想都難受,和三方溝通后的回復(fù),這個必須連真機,我建議做個兼容,模擬器能運行,調(diào)用SDK方法時判斷一下是否是真機,三方回復(fù)最近比較忙,以后有時間再支持,心里頓時有一萬個羊駝在奔騰。
打個支持模擬器的包那么難?
如果每個方法都做兼容確實有點麻煩,既然三方不能提供,為了我能自己調(diào)試方便就想想辦法,能不能生成一個相同的庫,合并到一起。
模擬器的是i386、x86_64,相關(guān)詳盡的知識還需要自行搜索。
于是我自己新建立了一個靜態(tài)庫工程,名字建議和拿到SDK的xxAPI.h文件名相同。

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

將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.

和三方溝通后得到結(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)庫,打包就正常了。

注意:自行編譯支持的架構(gòu)下對應(yīng)方法實體是空的,肯定是達不到三方提供效果,只是為了用起來方便,此方法是個野路子,建議還是三方提供較好。
疑問:最新流行的手機都支持arm64,只支持arm64打包還小,他不香嘛?那我們打包只支持arm64不可以嘛?答:只支持arm64那當然是可以的,不過xcode當前的默認配置是包含armv7的,手動去armv7打包xcode會有提示,既然官有提示那一定有他的道理(暫且不研究),所以支持一下默認配置還是較好的。