多年来,苹果已经改变了指令集。由于单个程序可能需要在不止一种机器上运行,因此Apple使用由名为“lipo”的工具构建的“胖二进制文件”。您告诉Xcode多次编译您的程序,每种机器类型编译一次,然后lipo将它们绑定在一起。
苹果最近发布了第四套针对iOS的指令集。第一批手机使用Armv6,来自3GS,我们有Armv7,为Armv7s添加了一些新的指令,现在,5S增加了Arm64。
我喜欢我的程序在一系列操作系统下运行,所以我将我的MIN_DEPLOYMENT_TARGET设置为5.0,这样苹果就可以从5.0开始在机器上加载程序。但是当在当前版本的Xcode中尝试时,我得到了一条错误消息,指出这在Arm64中是不可能的。
好的,我设置了一个条件构建设置:对于Arm64以外的体系结构,MIN_DEPLOYMENT_TARGET是5.0,但对于Arm64,它被设置为7.0。现在,程序进行编译、链接和Now。但现在,由于其中一个编译版本仅为iOS 7.0,我收到了一堆警告,指出我的程序包含对较旧操作系统的调用。我知道这个。这是故意的-所以程序将在那些较旧的系统上运行。在iOS 7系统上,这些旧的例程不会被调用,相反,在运行时,程序会调用它们的现代替代品。我可以让编译器停止抱怨:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
// old code here.
#pragma clang diagnostic pop而且,该程序在Armv7和Arm64的iOS 7设备上运行良好。一小段诊断代码验证了在Arm64设备上运行时,是否实际使用了Arm64分支。
在二进制文件上运行lipo会报告其中包含预期的体系结构。
但是,这是一个很大的问题:当我试图在iOS 5设备上安装这个应用程序时,Xcode只是弹出了一个警告:“有一个内部API错误。”
我认为iOS 5和iOS 6中有一个bug,所以他们不会忽略来自未来的分支。加载器应该简单地忽略它无法识别的fork。但这不是它的工作方式。
苹果永远不会修复iOS 5。我认为苹果可能会在应用程序加载到设备上时解决这个问题:让Xcode剥离不需要的分支,并对(现在修改后的)二进制文件进行重新签名。类似地,从iTunes下载可能会剥离不需要的分支并重新签名。但苹果不太可能这么做:苹果希望每个有能力的人都升级到iOS7。对于那些无法升级的人,苹果的解决方案是:购买新硬件。
所以,我们被困住了。你可以在支持5和6的应用商店中有一个标题,然后发布一个针对7的更新,即fat armv7和arm64,这样拥有iOS7的用户将获得胖的,拥有5或6的用户将获得旧的,但你只能这样做一次。一旦你发布了7更新,你就再也不能更新5&6更新了。
有什么办法可以解决这个问题吗?我想要一个在Armv7和arm64上运行的程序,在armv7端运行iOS 5和6,在harder上运行armv7的iOS 7,它不是arm64和iOS 7 Arm64,它是如何支持的?
发布于 2013-10-21 06:07:32
从当前的Xcode版本( 5.0 (5A1412)版)开始:
注意:未来版本的Xcode将允许您创建支持iOS 6及更高版本上的32位运行时和iOS 7上的64位运行时的单个应用程序。Apple Source
https://stackoverflow.com/questions/19482683
复制相似问题