iOS11后32位应用升级
2018-01-08 13:36
260 查看
今天接受了一个改造旧项目的任务,据说项目唯独在iOS11上无法运行。这很容易就让我们想到与最近苹果iOS11放弃支持32位应用的事件有关。确实我在平时开发的项目中也没怎么涉及这个问题,这次在升级应用支持64位的过程中还是遇到了些问题,所以在这里总结一下,也许还会有同行的朋友遇到。
2018年1月1日开始,苹果在iOS 11系统上停止了32位应用程序的服务支持,使用iOS11系统的用户将无法再在Appstore中搜索到32位应用。同时32位的应用不顺应趋势也会停止继续开发,所以iPhone5s以下的机型也都面临着App停止更新的情况,因为从iPhone5s之后的iOS设备才是64位设备,而iPhone5以下都是32位设备,。
这个区别对我们开发产生的影响在于,如果我们在项目中设置了支持不同的CPU架构,那么我们使用的静态库,动态库、以及打包的大小都会受到影响。关于在Xcode中设置不同CPU架构的支持可以参考下另一篇文章:(https://www.jianshu.com/p/441caa1138af)
1.修改ARchitectures,设置项目支持64位CPU
我们在Xcode中选择将要设置的target,然后打开build setting, 可以看到有关指令集设置的Architectures选项。
修改Vaild Architectures选项,增加arm64支持。
![](http://upload-images.jianshu.io/upload_images/1244124-e1799aaa2b65bc62.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/400)
2.更换各个平台的SDK
在经过上面的修改之后,我们的应用会编译失败。因为我们设置了项目需要支持arm64的架构,但是代码中使用的各个平台的SDK静态库还是只支持32位的。这就需要我们耐心的一个个更换了。这里有三个问题可能我们会遇到:
Xcode提示Build failed,但是没有明显的报错
解决:打开Xcode左侧导航栏选择最后一项,我们会在这里看到编译错误。
编译报错Undefined symbols for architecture x86_64
解决:这就是我们不支持64位的sdk报的错,我们可以从这里找到它并将其更换
问题三:如何判断一个SDK静态库是否支持64位?
解决:我们找到这个静态库文件(如百度分析的静态库),使用命令行:lipo -info libBaiduMobStat.a ,我们就可以看到其所支持的类型
我们修改的这类项目通常也是比较旧的代码了,如果使用最新的Xcode打开我们可能会遇到上面的报错。我们可以进行如下的设置来修改这个错误。如果我们在Target->Deployment info ->Deployment Target 设置的是8.0的话,我们对于每个XIB文件也要做如下的修改:
一、iOS11停止支持32位的来由
苹果于2013年9月推出了iPhone 5S新手机,采用的全新A7处理器其最大特色就是支持64位运算。64位A7处理器的使用意味着iPhone性能会大有提高,性能和速度更加出色;而要到达到这样的性能,开发者就要开发64位的应用了。因为即使64位的处理器再出色,如果还是安装32位的应用,那么64位处理的性能也不能发挥出来。2018年1月1日开始,苹果在iOS 11系统上停止了32位应用程序的服务支持,使用iOS11系统的用户将无法再在Appstore中搜索到32位应用。同时32位的应用不顺应趋势也会停止继续开发,所以iPhone5s以下的机型也都面临着App停止更新的情况,因为从iPhone5s之后的iOS设备才是64位设备,而iPhone5以下都是32位设备,。
二、了解iOS的CPU架构
我们说到了32位和64位的处理器,它们本质的区别还是在于,64位多出2个寄存器,而这两个寄存器在运行32位应用的时候是关闭的,只有在运行64位应用的时候才会激活,才会用上。这个区别对我们开发产生的影响在于,如果我们在项目中设置了支持不同的CPU架构,那么我们使用的静态库,动态库、以及打包的大小都会受到影响。关于在Xcode中设置不同CPU架构的支持可以参考下另一篇文章:(https://www.jianshu.com/p/441caa1138af)
三、升级32位应用支持64位
其实升级应用支持64位并不复杂,主要有以下两个步骤:1.修改ARchitectures,设置项目支持64位CPU
我们在Xcode中选择将要设置的target,然后打开build setting, 可以看到有关指令集设置的Architectures选项。
修改Vaild Architectures选项,增加arm64支持。
![](http://upload-images.jianshu.io/upload_images/1244124-e1799aaa2b65bc62.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/400)
2.更换各个平台的SDK
在经过上面的修改之后,我们的应用会编译失败。因为我们设置了项目需要支持arm64的架构,但是代码中使用的各个平台的SDK静态库还是只支持32位的。这就需要我们耐心的一个个更换了。这里有三个问题可能我们会遇到:
Xcode提示Build failed,但是没有明显的报错
解决:打开Xcode左侧导航栏选择最后一项,我们会在这里看到编译错误。
编译报错Undefined symbols for architecture x86_64
解决:这就是我们不支持64位的sdk报的错,我们可以从这里找到它并将其更换
问题三:如何判断一个SDK静态库是否支持64位?
解决:我们找到这个静态库文件(如百度分析的静态库),使用命令行:lipo -info libBaiduMobStat.a ,我们就可以看到其所支持的类型
四、其他可能遇到的问题
1.XIB报错:compiling IB documents for earlier than ios 7 is no longer supported我们修改的这类项目通常也是比较旧的代码了,如果使用最新的Xcode打开我们可能会遇到上面的报错。我们可以进行如下的设置来修改这个错误。如果我们在Target->Deployment info ->Deployment Target 设置的是8.0的话,我们对于每个XIB文件也要做如下的修改:
![](http://upload-images.jianshu.io/upload_images/1244124-dffa8dcdda725cf4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
相关文章推荐
- 实战iOS应用从32位升级到64位
- 是否升级IOS11?IOS11不支持32位程序 查看手机哪些APP不支持
- 实战iOS应用从32位升级到64位
- redhat5.9 应用centos的源进行升级
- 浅析android应用增量升级
- Android应用更新升级实现
- Win10(GWX)升级应用 提供一次额外确认已安排升级时间选项
- Linux 64位应用调用32位库
- Android应用的自动升级、更新模块的实现完整方案+参考程序
- 在64系统中如何使用32位驱动的应用
- android安卓升级版本安装后自动打开弹出完成和打开新版应用界面
- iOS appStore中的应用 实现版本升级功能
- iOS 11封杀32位应用,不少开发者宁愿放弃
- Bugly Android 应用升级 SDK 使用指南
- Android获取32位应用签名及如何判断该签名为debug还是release
- Google Play商店禁止应用自动升级
- Oracle32位升级到64位后问题汇总
- 用友盟的自动更新组件实现Android应用版本升级
- 微软本月将升级Win8核心应用 为Win Blue做准备