美文网首页
任意二进制库支持模拟器

任意二进制库支持模拟器

作者: 海辰 | 来源:发表于2024-11-26 14:56 被阅读0次

问题描述

iOS开发中经常要用到模拟器,甚至比真机被用得更频繁。模拟器相对真机有下面几种优势:

* 模拟器一般不卡,性能往往比在真机上跑更稳定,因为电脑有更大的内存,更稳定的网络。

* 可以模拟系统、设备、地理位置等。

* 调IM时,加一个模拟器,就可以互发消息了。

* 导Sandbox数据方便。

* 抓包比真机方便。

* 调试比真机方便,真机需要装证书。

* ...

然而,有时候第三方SDK集成时,第三方SDK可能不提供模拟器的x86架构,那么在链接时,就会提示无法找到符号。

如项目中引入不支持模拟器的SDK,链接时,会报没有找到x86_64架构对应的符号:

如果用lipo -info 命令查看libMyLib.a这个库,就会发现它只提供了 arm7和 arm64两种架构,而没有x86_64架构。

# lipo -info libMyLib.a

Architectures in the fat file: libMyLib.a are: armv7 arm64

如果碰到这种库,引入它之后,项目就不再能在模拟器上运行了,因为它链接都不会过。而我们往往希望引入库之前的其他功能仍能在模拟器上调试。

解决思路

你可以要求SDK厂商提供模拟器的版本,他们顶多改几行脚本,多产生一个x86架构,再把两个.a合并就行。但是如果碰上比较老没有维护的SDK,或者厂商认为SDK不需要考虑模拟器上运行的场景,那就比较麻烦了。

你可以把所有用到SDK的代码通过TARGET_OS_SIMULATOR宏来判断。但是这样可能工作量比较大,而且容易出问题。

这里另外给出一种思路,我们可以根据库中的头文件,自己空实现这些接口,最后编译产生一个x86架构的库,并把它加到工程里面,这样工程链接时就不会出错了。

空实现,指的是函数里什么都不做,直接返回。如:

+ (instancetype)footerWithRefreshingTarget:(id)target refreshingAction:(SEL)action {

    return 0;

}

我们知道,objc里面,如果调用空对象的方法,程序并不会有问题,只是什么都不做。如下面代码,虽然footer为nil,仍不会崩溃。

MyRefreshFooter *footer = [MyRefreshFooter footerWithRefreshingTarget:nil refreshingAction:nil];

[footer resetNoMoreData];

所以在模拟器上除了SDK的功能不能用,其他模块的功能并不会受影响。

这种思路除了能解决编译问题,还有种好处是,不用改任何原来工程中的代码,只是附加了一个x86的lib,不影响应用在真机上的功能。

确定了这种思路后,还可以把这种逻辑泛化应用到任意的库中,通过使用适当的工具,可以自动解析objc或cpp的头文件,产生相应空实现的代码,并编译产生需要的x86架构的库。

相关文章

  • iOS 静态库和动态库相关

    一、查看静态库支持架构 查看.a静态库和framework支持的架构 示例: 终端测试: iPhone真机和模拟器...

  • iOS 中SDK开发注意事项

    终端命令: 真机和模拟器上的库文件合并 Framework库合并的是Framework内包含的二进制文件,合并后替...

  • armv6, armv7, armv7s和i386

    i386是代表模拟器,显示i386错误说明静态库不支持模拟器,只支持真机。 armv6,armv7, armv7s...

  • iOS周刊第二期

    1.有些项目中引用了第三方库,可能不支持模拟器这可能是他们不支持模拟器。这个时候需要我们基于模拟器i386的架构生...

  • PHP BC数学函数

    对于任意精度的数学,PHP提供了支持用字符串表示的任意大小和精度的数字的二进制计算,最多为2147483647-1...

  • python 进制转换

    如何表示二进制 任意进制之间的转换 任意进制转换成二进制--bin 任意进制转换成十进制--int 3.任意进制转...

  • 合并FrameWork库兼容真机模拟器

    自己在生成静态库的时候需要让静态库同时支持模拟器和真机,具体要怎么操作呢? 1、Xcode EditScheme ...

  • 上传私有库到cocoapods上的踩坑之路(包含第三方静态库,p

    1.如果你包含的静态库不支持模拟器编译那么就不用往下看了,不支持模拟器编译时无法通过本地验证的,也就不能上传到co...

  • 私有库不支持模拟器,pod lib lint / repo pu

    最近封装公司的私有库,由于要对接Engine,Engine提供的库很多不支持模拟器编译,那么私有库发版就无法通过正...

  • ios私有库 关闭cocoapods模拟器编译

    在打包自己私有库的时候,有些私有库是不支持模拟器编译,在pod repo push的时候,总是报error 解决方...

网友评论

      本文标题:任意二进制库支持模拟器

      本文链接:https://www.haomeiwen.com/subject/usqqsjtx.html