在iOS 7上运行32位arm,在iOS 8上运行64位

时间:2015-01-14 11:56:07

标签: ios iphone ios8 arm64 metal

我正在开发一款针对iOS 5.1.1到iOS 8的应用。它是一个包含arm64,armv7和armv7s的通用二进制文件。现在,arm64将加载到iOS 7及更高版本(在支持的设备上),但我想强制它仅在iOS 8上加载(即,使iOS 7恢复为加载armv7s)。

动机:出于效率原因,我需要针对某些iOS 8特定功能进行条件编译。我在iOS 8上将整个渲染后端从OpenGL ES切换到Metal,并且不想为两者之间的任何动态调度付费。后端是一堆c函数,因此动态选择API需要额外的一层函数指针。如果arm64只是iOS 8,我可以使用#ifdef __arm64__有条件地编译Metal的使用。

我认为可行的方法:我正在“iOS部署目标”下为arm64添加条件构建设置。我检查了构建日志,看到为arm64构建添加了-miphoneos-version-min=8.0。它在iOS 8和arm64上运行良好。对于iOS 7和arm64,我看到两种可能的结果; 1)iOS 7查看64位二进制文​​件,将其丢弃为不支持,然后继续加载armv7s。 2)尝试加载64位二进制文​​件并崩溃。问题是我唯一的64位设备运行iOS 8,所以我无法测试它。

我的问题是,如果这样做(也许有人之前尝试过这种方法),或者,如果有另一种解决问题的方法。

参考条件构建设置的屏幕截图:

Conditional build setting

1 个答案:

答案 0 :(得分:1)

也许为iOS 7&amp ;;创建2个独立的构建方案8(每个方案具有不同的构建设置)可以做你想要的。

更新

很抱歉我误解了我的答案的初始版本。深入研究您的问题,我意识到您需要使用条件编译来处理特定于运行时的条件。也就是说,您需要在编译时知道在用户设备上运行的iOS版本等运行时特性。这就是为什么你试图将iOS版本的使用限制在某种架构的原因 - 在这种情况下你会知道如果当前的arch是arm64,那么设备正在运行iOS 8.很抱歉没有得到这个。

问题是架构是硬件属性(iOS Support Matrix)。 arm64架构由iPhone 5S和iPhone 6支持,同时iPhone 5S可能配备iOS 7.因此,如果您将arm64限制为iOS 8,那么您将在iPhone 5S上放弃对iOS 7的支持(您自己找到的) )。

所以我认为你选择的方法是行不通的。不幸的是,在编译时我找不到任何其他方法来了解iOS版本的运行时特性。

我知道我的答案并没有解决你的问题。

相关问题