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

标签 ios iphone ios8 arm64 metal

我正在开发一个针对 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 添加条件build设置。我检查了构建日志,发现为 arm64 构建添加了 -miphoneos-version-min=8.0。它在 iOS 8 和 arm64 上运行良好。对于 iOS 7 和 arm64,我看到两种可能的结果; 1) iOS 7 查看 64 位二进制文​​件,将其视为不受支持而丢弃,然后继续加载 armv7s。 2) 尝试加载 64 位二进制文​​件并崩溃。问题是我唯一的 64 位设备运行 iOS 8,所以我无法对其进行测试。

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

供引用的条件build设置的屏幕截图:

Conditional build setting

最佳答案

也许为 iOS 7 和 8 创建 2 个单独的构建方案(每个方案具有不同的build设置)可以做你想做的。

更新

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

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

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

我知道我的回答不能解决您的问题。

关于ios - 在 iOS 7 上运行 32 位 arm,在 iOS 8 上运行 64 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27942386/

相关文章:

iphone - 有没有办法为 iOS 应用程序禁用 Game Center?

iphone - objective-c 接口(interface) - 声明变量还是仅声明属性?

iphone - Game Center localPlayer 始终经过身份验证

ios - 无法在 ios8 的文档目录中复制可写 plist 文件

ios - iOS 8.0 公开版本的内部版本号是多少?

ios - 将复杂的 Xcode 项目集成到另一个项目中的最佳方式

ios - 作为 TableView 数据源的 Swift 通用枚举

objective-c - 编译选项 -fPIC 时出现 Gcc 错误

ios - MagicalRecord saveWithBlock 与 saveToPersistentStoreAndWait

ios8 - 使用 youtube-ios-player-helper 和 iOS 8 的自动布局问题