0

我正在开发一个针对 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__.

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

我的问题是这是否可行(也许以前有人尝试过),或者是否有其他解决方案。

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

条件构建设置

4

1 回答 1

1

也许为 iOS 7 和 8 创建 2 个单独的构建方案(每个方案具有不同的构建设置)可以满足您的需求。

更新

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

问题在于架构是硬件属性(iOS 支持矩阵)。iPhone 5S 和 iPhone 6 支持 arm64 架构,同时 iPhone 5S 可能有 iOS 7。所以如果你将 arm64 限制为 iOS 8,那么你在 iPhone 5S 上放弃对 iOS 7 的支持(你自己发现的) )。

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

我明白我的回答不能解决你的问题。

于 2015-01-14T12:56:05.480 回答