这是 Xcode 27 引入的破坏性变更——Xcode 27 首次不再附带 Simulator.app,模拟器 GUI 被并入新的 DeviceHub.app。HBuilderX 仍按老版本习惯执行 open -a Simulator,于是在 Xcode 27 机器上必挂。做一个名为 Simulator.app 的转发壳即可修复,几 KB、随时可删。
出了什么问题
升级 Xcode 27 后,在 HBuilderX 里运行到 iOS 模拟器基座,直接报错:
Command failed: open -a Simulator
Unable to find application named 'Simulator'
Xcode 26 及以前一直正常,这是 Xcode 27 才出现的问题。
什么原因
Xcode 27 起不再附带 Simulator.app,模拟器界面并入了新的 DeviceHub.app:
ls /Applications/Xcode.app/Contents/Applications/
# DeviceHub.app 在这里,Simulator.app 没了
模拟器本体没坏(simctl、运行时、设备都正常),但 HBuilderX 启动模拟器时写死执行 open -a Simulator,系统里已经没有叫这个名字的应用,于是启动失败。这是 DCloud 论坛的已知问题,官方暂未适配。
怎么解决
在 /Applications 下创建一个名为 Simulator.app 的转发壳,把 open -a Simulator 转给 DeviceHub:
mkdir -p "/Applications/Simulator.app/Contents/MacOS"
cat > "/Applications/Simulator.app/Contents/Info.plist" <<'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleName</key>
<string>Simulator</string>
<key>CFBundleDisplayName</key>
<string>Simulator</string>
<key>CFBundleIdentifier</key>
<string>com.local.simulator-launcher</string>
<key>CFBundleExecutable</key>
<string>SimulatorLauncher</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>LSUIElement</key>
<true/>
<key>LSMinimumSystemVersion</key>
<string>13.0</string>
</dict>
</plist>
EOF
cat > "/Applications/Simulator.app/Contents/MacOS/SimulatorLauncher" <<'EOF'
#!/bin/bash
# Xcode 27 起不再附带 Simulator.app,模拟器界面由 DeviceHub 承担,
# 把 open -a Simulator 转发给 DeviceHub。
exec /usr/bin/open -a "/Applications/Xcode.app/Contents/Applications/DeviceHub.app" "$@"
EOF
chmod +x "/Applications/Simulator.app/Contents/MacOS/SimulatorLauncher"
# 注册到 LaunchServices
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister \
-f /Applications/Simulator.app
验证一下:
open -a Simulator # DeviceHub 正常打开即可
然后重启 HBuilderX,重新运行到 iOS 模拟器即可恢复和以前一样的流程。如果 DeviceHub 里没自动弹出模拟器画面,在它左侧设备列表点一下对应的 iPhone。
想撤销的话,删掉 /Applications/Simulator.app 就行;等 HBuilderX 官方适配 Xcode 27 后也可以删。
评论