Apple最近推出了针对iOS的第四个指令集.第一部手机使用的是Armv6,来自3GS,我们有Armv7,为Armv7s添加了一些新指令,现在,5S增加了Arm64.
我喜欢我的程序在一系列操作系统下运行,因此我将MIN_DEPLOYMENT_TARGET设置为5.0,因此Apple将在5.0以上的机器上加载程序.但是当在当前版本的Xcode中尝试时,我收到一条错误消息,说在Arm64中是不可能的.
好的,我设置了一个条件构建设置:对于Arm64以外的架构,MIN_DEPLOYMENT_TARGET为5.0,但Arm64的设置为7.0.现在程序编译,链接和脂肪.但是现在,由于其中一个编辑只是iOS 7.0,我得到一堆警告,我的程序包含对旧操作系统的调用.我知道.这是故意的 – 所以程序将在那些旧系统上运行.在iOS 7系统上,不调用那些旧例程,而是在运行时,程序调用它们的现代替换.我可以让编译器停止抱怨:
#pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-declarations" // old code here. #pragma clang diagnostic pop
该程序在iOS 7设备上运行良好,包括Armv7和Arm64.一些诊断代码验证在Arm64设备上运行时,实际上正在使用Arm64分支.
在二进制文件上运行lipo报告它具有预期的体系结构.
但是,这是一个很大的问题:当我尝试在iOS 5设备上安装应用程序时,Xcode只是发出警告:“存在内部API错误.”
我认为iOS 5和iOS 6中存在一个错误,因此他们不会忽略未来的分叉.加载器应该简单地忽略它无法识别的分叉.但这不是它的工作方式.
Apple永远不会修复iOS 5.我认为当应用程序加载到设备上时Apple可能会解决这个问题:让Xcode剥离不需要的fork,然后重新签名(现在修改过的)二进制文件.同样,从iTunes下载可能会删除不需要的分叉并重新签名.但苹果不太可能这样做:Apple希望每个人都可以升级到iOS7.对于那些无法升级的人而言,Apple解决方案是:购买新硬件.
所以,我们被困住了.您可以在支持5& 6的应用程序商店中拥有一个标题,并发布7个胖胖armv7和arm64的更新,因此拥有iOS7的用户将获得胖,而拥有5或6的用户将会得到旧的,但你只能做一次.发布7更新后,您再也无法更新5& 6更新.
有没有解决的办法?我想在armv7和Arm64上运行一个程序,在armv7方面运行iOS 5和6,在arm7上运行iOS 7,更难以支持arm64和iOS 7 arm64,如何支持,如何?