【问题标题】:Run 32-bit arm on iOS 7 and 64-bit on iOS 8在 iOS 7 上运行 32 位 arm,在 iOS 8 上运行 64 位
【发布时间】: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


【解决方案1】:

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

更新

抱歉,我的回答的初始版本具有误导性。深入研究您的问题,我意识到您需要对特定于运行时的条件使用条件编译。也就是说,您需要在编译时了解运行时特性,例如在用户设备上运行的 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 版本等运行时特性。

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

【讨论】:

  • 你说的是生成两个不同的二进制文件吗?在这种情况下,这不是一个真正的选择。
  • 作为一个选项,您可以为不同的拱门生成多个二进制文件并手动生成一个胖二进制文件。我相信这可以自动化。当然这不是一个优雅的解决方案......
  • 这与我已经做过的有什么不同?我尝试在通用二进制文件中添加一个 64 位二进制文​​件,最低 iOS 版本设置为 8。不幸的是,它没有加载。我很确定你不能有两个具有相同拱门的二进制文件,因此添加另一个将 iOS 版本设置为 7 的 arm64 二进制文件并不是一个真正的选择。
猜你喜欢
  • 2010-09-16
  • 1970-01-01
  • 2011-05-13
  • 1970-01-01
  • 2012-11-03
  • 2012-06-12
  • 2012-03-12
  • 1970-01-01
  • 2011-04-03
相关资源
最近更新 更多