【发布时间】:2015-01-14 11:56:07
【问题描述】:
我正在开发一个针对 iOS 5.1.1 到 iOS 8 的应用程序。它是一个包含 arm64、armv7 和 armv7s 的通用二进制文件。现在,arm64 将在 iOS 7 及更高版本(在受支持的设备上)上加载,但我想强制它仅在 iOS 8 上加载(即,让 iOS 7 恢复为加载 armv7s)。
动机:出于效率原因,我需要对某些 iOS 8 特定功能进行条件编译。我正在将整个渲染后端从 OpenGL ES 切换到 iOS 8 上的 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,所以我无法对其进行测试。
我的问题是这是否可行(也许有人以前尝试过),或者是否有其他解决方案。
条件构建设置截图供参考:
【问题讨论】:
-
我不认为有任何方法可以强制 iOS 7 忽略二进制文件中的 64 位。您唯一的选择是提供两个不同的二进制文件,这可能不是您想要的。
-
我能够使用运行 iOS 7 的 iPhone 5S 测试我的方法,但不幸的是它不起作用。 Xcode 甚至不会传输声称需要 iOS 8 的二进制文件。
标签: ios iphone ios8 arm64 metal