Iphone 如何制作将在iOS 5到iOS 7上运行的armv7 arm64 fat二进制文件?

Iphone 如何制作将在iOS 5到iOS 7上运行的armv7 arm64 fat二进制文件?,iphone,ios,xcode,Iphone,Ios,Xcode,多年来,苹果改变了指令集。由于单个程序可能需要在不止一种机器上运行,苹果使用了由一个名为“lipo”的工具构建的“胖二进制文件”。您告诉Xcode多次编译您的程序,每种机器类型编译一次,lipo将它们绑定在一起 苹果最近推出了第四套iOS指令集。最早的手机使用了Armv6,从3GS开始,我们有了Armv7,为Armv7s添加了一些新的指令,现在,5S增加了Arm64 我喜欢我的程序在一系列操作系统下运行,因此我将MIN_DEPLOYMENT_目标设置为5.0,这样苹果公司将在5.0以后的机器上加

多年来,苹果改变了指令集。由于单个程序可能需要在不止一种机器上运行,苹果使用了由一个名为“lipo”的工具构建的“胖二进制文件”。您告诉Xcode多次编译您的程序,每种机器类型编译一次,lipo将它们绑定在一起

苹果最近推出了第四套iOS指令集。最早的手机使用了Armv6,从3GS开始,我们有了Armv7,为Armv7s添加了一些新的指令,现在,5S增加了Arm64

我喜欢我的程序在一系列操作系统下运行,因此我将MIN_DEPLOYMENT_目标设置为5.0,这样苹果公司将在5.0以后的机器上加载该程序。但是,在当前版本的Xcode中尝试此操作时,我收到一条错误消息,表示在Arm64中不可能这样做

好的,我设置了一个有条件的构建设置:对于Arm64以外的体系结构,MIN_DEPLOYMENT_目标是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报告它具有预期的体系结构

但是,这是一个大问题:当我尝试在iOS5设备上安装应用程序时,Xcode只是发出了一个警报:“出现了一个内部API错误。”

我认为iOS 5和iOS 6中存在一个bug,因此它们不会忽略来自未来的分叉。装载机应该忽略它无法识别的叉。但事实并非如此

苹果永远不会修复iOS5。我认为苹果可能会在将应用程序加载到设备上时解决这个问题:让Xcode去掉不需要的fork,然后对(现在修改过的)二进制文件重新签名。类似地,从iTunes下载可能会删除不必要的fork并重新签名。但苹果不太可能做到这一点:苹果希望所有有能力的人都升级到iOS7。对于那些无法升级的用户,苹果的解决方案是:购买新的硬件

所以,我们被困住了。你可以在app store中拥有一个支持5和6的标题,并发布一个针对7的更新,即胖armv7和arm64,这样拥有iOS7的用户将获得胖标题,拥有5或6的用户将获得旧标题,但你只能执行一次。一旦发布7更新,您就再也不能更新5和6更新了


有办法解决这个问题吗?我想要一个在Armv7和Arm64上运行的单一程序,在Armv7端运行iOS 5和6,在不是Arm64的硬盘上运行iOS 7,在支持iOS 7的地方运行iOS 7 Arm64,如何在iOS 5上打开带有64位碎片的二进制文件。这是操作系统级别的限制,没有办法绕过它。一般来说,不必再支持iOS5了,但我相信某个地方有人有合法的理由支持它,希望他们会发现这个问题


如果您必须支持iOS 5,则必须删除64位的条子。我认为这不会阻止你的应用程序在64位系统上运行。它只是让它作为一个32位应用程序运行。大多数用户甚至不会注意到差异。

从当前的Xcode版本(5.0版(5A1412))开始:

注意:未来版本的Xcode将允许您创建一个应用程序,在iOS 6及更高版本上支持32位运行时,在iOS 7上支持64位运行时。


苹果在iOS 5.1中解决了这个问题,所以,如果你将你的最小部署目标设置为5.1,那么你可以制作一个32/64 fat二进制文件,在5.1上运行。在5.1面世之前,我写了最初的问题。

该源代码并不表示单个二进制文件可以支持iOS 5和之前版本的64位二进制文件。目前的Xcode版本(5.0)已经支持使用32位和64位碎片构建。至少有1500万个理由支持iOS 5。最初的iPad不能超过iOS 5,苹果售出了超过1500万台。据统计,iOS 5和之前的产品约占所有活动设备的7%。在大多数情况下,这不再值得支持,但这必须由每个开发人员根据具体情况做出决定。@Neal你知道我是否仍然可以使用Xcode 6和SDk 8.1为iOS 5.1.1制作exe吗?我尝试删除arm64,但在将我的IPA验证到应用商店时收到错误。你应该可以,但我最近没有尝试。您可能遇到的一个问题是ARMV7S支持被删除。我试图使exe与5.1.1兼容,并将arm64包含在体系结构中(像您一样),我可以在5.1.1设备中运行应用程序,但当我从Xcode 5.1运行时,我可以在5.1.1设备中运行应用程序,但当我创建ipa文件(安装程序)并尝试通过Itunes在设备中安装时,它在安装过程中不起作用“挂起”。你能为这种情况找到解决方案吗?还是只留下32位的选项?我无法让它工作。Arm64+iPad 1@iOS 5.1.1,不工作。你是怎么做到的?