Apple Silicon Mac 上运行 x86_64 iOS 模拟器应用

26 年 8 月 15 日 星期六 (已编辑)
1564 字
8 分钟

iOS 模拟器运行 x86_64 应用的 Rosetta 解决方案

1. 问题背景

在 Apple Silicon Mac 上向 iOS 模拟器安装一个旧版 LegacyApp.app 时,安装失败并提示:

text
App installation failed
Failed to find matching arch for input file: .../LegacyApp.app/LegacyApp

本次环境如下:

项目实际情况
Mac 架构Apple Silicon,arm64
XcodeXcode 26.2(Build 17C52)
原模拟器 RuntimeiOS 26.3 Apple Silicon 版本,仅包含 arm64
应用主程序LegacyApp.app/LegacyApp,仅包含 x86_64
应用平台iphonesimulator
Bundle IDcom.example.legacyapp(示例)
最低系统版本iOS 12.0
Rosetta已安装

应用位于:

text
/path/to/LegacyApp.app

2. 根本原因

这个问题不是签名、权限或应用版本导致的,而是 CPU 架构不匹配:

text
Apple Silicon Mac

默认启动 arm64 iOS Simulator Runtime

尝试安装只有 x86_64 指令的 LegacyApp

模拟器找不到可执行的匹配架构,安装失败

需要区分三个概念:

  1. Mac 主机架构:当前机器为 arm64
  2. Simulator Runtime 架构:默认下载的是 Apple Silicon 精简版本,系统组件只有 arm64
  3. 应用架构:当前应用只有 x86_64,是面向 Intel iOS 模拟器构建的应用。

普通 arm64 模拟器不能直接加载 x86_64 应用。虽然 macOS 已安装 Rosetta,但仅安装 Rosetta 并不足够,还必须安装包含 Intel 模拟器组件的 Universal Simulator Runtime,并使用名称带 (Rosetta) 的目标模拟器。

3. 诊断方法

3.1 检查 Mac 架构

bash
uname -m

Apple Silicon Mac 应返回:

text
arm64

3.2 检查应用主程序架构

bash
file "/path/to/LegacyApp.app/LegacyApp"

本次输出为:

text
Mach-O 64-bit executable x86_64

也可以使用:

bash
lipo -archs "/path/to/LegacyApp.app/LegacyApp"

3.3 确认它是模拟器应用

bash
plutil -p "/path/to/LegacyApp.app/Info.plist" \
  | grep -E 'CFBundleIdentifier|DTPlatformName|DTSDKName|MinimumOSVersion'

关键字段应包含:

text
DTPlatformName = iphonesimulator

如果这里显示 iphoneos,说明拿到的是面向真机的应用,即使架构匹配,也不能直接安装到模拟器。

3.4 检查 Rosetta 是否安装

bash
pkgutil --pkg-info=com.apple.pkg.RosettaUpdateAuto

如果未安装,可执行:

bash
softwareupdate --install-rosetta --agree-to-license

3.5 检查 Simulator Runtime 架构

可以检查 Runtime 中的 launchd_simdyld_sim

bash
file "/Library/Developer/CoreSimulator/Volumes/<Runtime目录>/Library/Developer/CoreSimulator/Profiles/Runtimes/<iOS版本>.simruntime/Contents/Resources/RuntimeRoot/sbin/launchd_sim"

如果只返回 arm64,说明当前安装的是 Apple Silicon Runtime,不能承载 x86_64 模拟器应用。

4. 解决思路

完整解决链路为:

text
确认应用确实是 x86_64 的 iphonesimulator 构建

确保 macOS 已安装 Rosetta

下载 iOS Universal Simulator Runtime

让 Xcode 显示 x86_64 / Rosetta 运行目标

启动名称带 (Rosetta) 的模拟器

安装并启动目标 .app

5. 实际解决步骤

5.1 下载 Universal Simulator Runtime

本次使用 Xcode 官方命令明确下载 iOS 26.1 Universal Runtime:

bash
xcodebuild \
  -downloadPlatform iOS \
  -buildVersion 26.1 \
  -architectureVariant universal

实际下载内容为:

text
iOS 26.1 Universal Simulator (23B86)

下载大小约为 10.33 GB。安装完成后返回了 Runtime 标识:

text
iOS 26.1 (23B86) - EDB7FE87-E64E-408D-9012-5927884C3730

如果不指定 -buildVersion,而最新 Runtime 已安装为 ARM 版本,Xcode 可能提示:

text
No needed downloadables found for universal

这种情况下应明确指定一个仍提供 Universal 变体的版本,例如本次使用的 26.1

5.2 让 Xcode 使用 x86_64 模拟器目标

如果有应用源工程,可以临时在模拟器构建配置中排除 arm64

text
EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64

然后在 Xcode 中打开运行目标(Run Destination)列表,选择名称带 (Rosetta) 的设备,例如:

text
iPhone 17 Pro Max (Rosetta) 26.1

部分 Xcode 版本还可通过以下菜单控制运行目标的显示:

text
Product → Destination → Destination Architectures → Show Rosetta Destinations

如果只有编译好的 .app、没有源工程,可以创建一个临时 iOS 工程,将模拟器架构设置为 x86_64,用它启动 Rosetta 模拟器。临时工程仅用于选择和启动对应的模拟器,不会修改目标应用。

EXCLUDED_ARCHS 只是兼容旧版 Intel 模拟器依赖的临时措施。应用和第三方库支持 arm64-simulator 后,应删除该配置。

5.3 安装应用

Rosetta 模拟器启动后,可以将 .app 拖到模拟器窗口,也可以使用 simctl

先查找设备 UDID:

bash
xcrun simctl list devices available

安装应用:

bash
xcrun simctl install \
  <Rosetta模拟器UDID> \
  "/path/to/LegacyApp.app"

例如,可以使用以下目标模拟器:

text
iPhone 17 Pro Max (Rosetta) 26.1

使用实际查询到的 UDID 执行:

bash
xcrun simctl install \
  <Rosetta模拟器UDID> \
  "/path/to/LegacyApp.app"

5.4 启动应用

bash
xcrun simctl launch \
  <Rosetta模拟器UDID> \
  com.example.legacyapp

最终目标应用成功进入启动页面。

6. 常见误区

6.1 只安装 Rosetta,不安装 Universal Runtime

不够。Rosetta 提供 Intel 指令翻译能力,但 ARM 精简版 Simulator Runtime 内部没有相应的 x86_64 系统组件。必须同时具备:

  • macOS Rosetta;
  • Universal Simulator Runtime;
  • Rosetta 运行目标。

6.2 把整个 Xcode 设置为“使用 Rosetta 打开”

不建议这样做。正确方式是让 Xcode 原生运行,只把目标模拟器切换为 Rosetta 运行目标。Apple 也建议通过运行目标架构处理这类兼容问题。

6.3 选择普通模拟器后反复安装

普通设备名称例如:

text
iPhone 17 Pro Max

通常是 arm64 运行目标。应选择:

text
iPhone 17 Pro Max (Rosetta)

6.4 把真机 IPA 当作模拟器包

真机应用使用 iphoneos 平台,模拟器应用使用 iphonesimulator 平台。两者不能互换。仅看文件扩展名或 arm64 字样无法判断,必须检查 DTPlatformName 和 Mach-O 平台信息。

6.5 永久排除 arm64

不应把排除 arm64 当作长期方案。这样会让所有开发者持续依赖 Rosetta 模拟器,速度、调试稳定性和未来兼容性都会受到影响。

7. 长期建议

最理想的方案是重新构建应用及其所有依赖,使模拟器版本至少包含:

text
arm64-apple-ios-simulator

如需同时兼容 Intel Mac 和 Apple Silicon Mac,可以生成包含以下架构的模拟器产物:

text
arm64 + x86_64

第三方二进制库建议使用 XCFramework,分别保存真机与模拟器 Slice,例如:

text
SomeSDK.xcframework/
├── ios-arm64/
└── ios-arm64_x86_64-simulator/

不要把真机 arm64 和模拟器架构混装在同一个普通 Framework Slice 中。

8. 快速检查清单

遇到同类问题时,按下面的顺序排查:

  • uname -m 是否为 arm64
  • 应用主程序是否只有 x86_64
  • DTPlatformName 是否为 iphonesimulator
  • Rosetta 是否已安装?
  • Simulator Runtime 是否为 Universal 版本?
  • Xcode 运行目标名称是否带 (Rosetta)
  • 应用内嵌 Framework 和动态库是否也包含 x86_64
  • 使用的 Bundle ID 是否正确?

9. 官方参考

文章标题:Apple Silicon Mac 上运行 x86_64 iOS 模拟器应用

文章作者:stone zhang

文章链接:https://zhang-stone.github.io/posts/ios-simulator-x86-64-rosetta[复制]

最后修改时间:


商业转载请联系站长获得授权,非商业转载请注明本文出处及文章链接,您可以自由地在任何媒体以任何形式复制和分发作品,也可以修改和创作,但是分发衍生作品时必须采用相同的许可协议。
本文采用CC BY-NC-SA 4.0进行许可。