背景:最近公司的App需要接个小型打印机,有三方提供iOS/Android的SDK。
当我拿到SDK,拉到原生工程,模拟器运行报错(Building for iOS simulator, but the linked library xxx.a was built for iOS)。
WeChat0430cd3e2624e0e847b75abb06474a42.png原生工程写了很多功能,为了接个业务以后都要连接手机调试,想想都难受,和三方沟通后的回复,这个必须连真机,我建议做个兼容,模拟器能运行,调用SDK方法时判断一下是否是真机,三方回复最近比较忙,以后有时间再支持,心里顿时有一万个羊驼在奔腾。
打个支持模拟器的包那么难?
如果每个方法都做兼容确实有点麻烦,既然三方不能提供,为了我能自己调试方便就想想办法,能不能生成一个相同的库,合并到一起。
模拟器的是i386、x86_64,相关详尽的知识还需要自行搜索。
于是我自己新建立了一个静态库工程,名字建议和拿到SDK的xxAPI.h文件名相同。
WX20210818-161008@2x.png
工程创建后,我们就发现工程里有两个文件xxAPI.h和xxAPI.m。我们把三方提供的xxAPI.h里的方法名全部复制过来,然后在xxAPI.m也复制一份,将所有的方法加上大括号,需要有返回值的都返回个对类型的默认值,然后选中模拟器再Command+B,我们要的模拟器库就出来了,基本就花了5分钟吧。
WX20210818-163755@2x.png将xxAPI.a复制到桌面的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
// 等待命令执行完毕
打开test文件夹,就发现lib.a文件,将这个新出炉的静态库放重新导入到工程,选择模拟器运行,app成功run起来。
code业务好几天,当我准备打包时发现报错,报错如下:
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
和三方沟通后得到结果是三方提供的静态库用了一别的库不支持armv7,那我们还是自力更生吧。
网上搜索了一下架构相关的如下:目前为止Apple移动设备默认指令集(2014.8.22)
armv6 设备: iPhone, iPhone2, iPhone3G, 第一代、第二代 iPod Touch
armv7 设备: iPhone3GS, iPhone4, iPhone4S, iPad, iPad2, iPad3(The New iPad), iPad mini,iPod Touch 3G, iPod Touch4
armv7s设备: iPhone5, iPhone5C, iPad4(iPad with Retina Display)
arm64 设备: iPhone5S, iPad Air, iPad mini2(iPad mini with Retina Display)
网上搜索了很多没有太详尽的资料(时间有限),iphone 5s 以后的手机都是arm64架构吧。
当前是2021年8月iphone 5s及以前的手机应该都淘汰了吧,那么我们就暂时忽略这些设备,就算有老设备,至少能安装上,这个打印业务用不了,但其他业务可以用啊!!!!
于是我打开静态库工程,将模拟器换成设备,将打包设置成armv7然后Command+B,一会儿armv7的包就出来,重复上面的方法将armv7合并到新生成的库上,更新原工程里的静态库,打包就正常了。
WX20210818-170457@2x.png
注意:自行编译支持的架构下对应方法实体是空的,肯定是达不到三方提供效果,只是为了用起来方便,此方法是个野路子,建议还是三方提供较好。
疑问:最新流行的手机都支持arm64,只支持arm64打包还小,他不香嘛?那我们打包只支持arm64不可以嘛?答:只支持arm64那当然是可以的,不过xcode当前的默认配置是包含armv7的,手动去armv7打包xcode会有提示,既然官有提示那一定有他的道理(暂且不研究),所以支持一下默认配置还是较好的。
网友评论