macOS 27 下两个 Xcode 坑:真机 DDI 错配与模拟器 App Translocation

环境:macOS 27 / Xcode 26.6 + Xcode 27.1 / iPhone 12 iOS 26.6

关键词:DDI、CoreDevice、devicectl、App Translocation、Gatekeeper、SimulatorKit

最近在 macOS 27 上踩了两个很典型、但报错方向都很"误导"的坑:

  1. Xcode 真机报 must be paired / Failed to find a DDI,但配对根本没坏;
  2. iOS 模拟器一启动就崩,网上让重装 Xcode 的方案全无效。

这两个问题看起来没关系,本质都是:macOS 系统级组件 / 安全机制和 Xcode 实际状态没对齐。

下面先给问题速查,再给完整排查和修复命令。


问题速查:问题 → 答案

Q:真机报 The device must be paired before it can be connected,是配对坏了吗?

A:不一定。文中配对状态一直是 paired / connected / 开发者模式 enabled。真正问题是系统 DDI 太旧,和 CoreDevice 框架版本不匹配。

Q:真机 DDI 问题怎么快速确认?

A:跑:

bash 复制代码
xcrun devicectl list preferredDDI

看 iOS 段是否出现:

text 复制代码
contentIsCompatible: false
isUsable: false
The DDI's CoreDevice content is too old

Q:真机 DDI 问题怎么修?

A:从 Xcode 27.1 安装包里展开 XcodeSystemResources.pkg,取出新 CandidateDDIs,再用 devicectl manage ddis update 显式指定新源,并关掉旧候选源。

Q:模拟器弹"Simulator 因为出现问题而无法打开",是 Xcode 版本不匹配吗?

A:多数不是。真因是 Gatekeeper 的 App Translocation 把 Simulator.app 随机挂载到只读路径,导致 dyld 找不到 SimulatorKit.framework。

Q:模拟器问题怎么快速确认?

A:看崩溃日志 procPath 是否包含 AppTranslocation,并检查:

bash 复制代码
xattr -p com.apple.quarantine /Applications/Xcode.app 2>&1
xattr -p com.apple.quarantine /Applications/Xcode.app/Contents/Developer/Applications/Simulator.app 2>&1

出现 com.apple.quarantine: 00c1;... 基本就是它。

Q:模拟器问题怎么修?

A:删除 Xcode.app 和 Simulator.app 顶层的隔离属性,不要一上来递归整个 Xcode。


一、真机报 must be paired:别修配对,先查 DDI

1. 现象

Xcode 跑真机时提示:

text 复制代码
Previous preparation error: The device must be paired before it can be connected.

或者:

text 复制代码
Failed to find a DDI that can be used to enable Core Device built-in services on the device.

但设备状态其实是好的:

text 复制代码
配对: paired | 隧道: connected | 开发者模式: enabled

所以不要重插线、不要重置信任、不要重新配对,大概率白干。

2. 一句话根因

系统里的 CoreDevice 框架是新版:

text 复制代码
CoreDevice 651.13.5

但系统里的开发者磁盘映像 DDI 还是旧版:

text 复制代码
CoreDevice-518.33

版本对不上,真机内建服务起不来,设备准备失败,上层就笼统报"未配对"。

可以简单理解成:

  • CoreDevice:Mac 和 iPhone 通信的"管家",系统级;
  • DDI:真机调试时挂到手机上的"工具盘",也是系统级;
  • 多 Xcode 共存时,这两个目录全机只有一份,很容易出现"新管家配旧工具盘"。

3. 10 秒定位

bash 复制代码
xcrun devicectl list preferredDDI

重点看 iOS 段:

text 复制代码
contentIsCompatible: false
isUsable: false
The DDI's CoreDevice content is too old

出现 false,就是 DDI 错配。

4. 为什么直接 update 没用?

很多人第一反应是:

bash 复制代码
xcrun devicectl manage ddis update --timeout 300

但默认它会从这些地方找候选:

  • 当前 xcode-select 选中的 Xcode;
  • /Library/Developer/CoreDevice/CandidateDDIs;
  • CoreDevice 自带资源。

如果这些地方全是旧 DDI,更新完还是旧盘。

5. 正确修复:从 Xcode 27.1 安装包里取新 DDI

先备份旧映像:

bash 复制代码
cp -a /Library/Developer/DeveloperDiskImages /tmp/ddi_backup_$(date +%Y%m%d_%H%M%S)

展开 Xcode 27.1 的系统资源包:

bash 复制代码
rm -rf /tmp/ddi271
pkgutil --expand-full \
  "/Applications/Xcode 27.1.app/Contents/Resources/Packages/XcodeSystemResources.pkg" \
  /tmp/ddi271

指定新 DDI 源安装:

bash 复制代码
SRC=/tmp/ddi271/Payload/Library/Developer/CoreDevice/CandidateDDIs

xcrun devicectl manage ddis update \
  --source-dir "$SRC" \
  --clean \
  --no-include-coredevice \
  --no-include-xcode \
  --timeout 300

关键在最后两个参数:

  • --source-dir:明确使用 Xcode 27.1 里的新 DDI;
  • --clean:安装前清空旧 DDI 目录;
  • --no-include-coredevice:不把系统旧候选池算进去;
  • --no-include-xcode:不把当前选中的旧 Xcode 算进去。

6. 验证

bash 复制代码
xcrun devicectl list preferredDDI

期望结果:

text 复制代码
buildUpdate: 27A9275
contentIsCompatible: true
CoreDevice-651.13.5
isUsable: true

再打一枪端到端:

bash 复制代码
xcrun devicectl device info lockState --device <UDID> --timeout 25

能正常返回,说明通道通了。

输出里如果提示 No DDI was found for the macOS / rtKitOS platform,跟 iOS 真机无关,不用管。

7. 修完还报错?两个后续坑

坑 1:Previous preparation error 是缓存。

底层修好后,Xcode 界面可能还挂着黄字。必须 ⌘Q 彻底退出 Xcode 再重开,必要时重插 USB。

坑 2:iOS 26.6 真机 + Xcode 26.6 SDK 只到 iOS 26.5。

如果 DDI 修好后改口提示"设备系统版本不受支持",别回头折腾 DDI,直接用 Xcode 27.1 跑。

8. 防复发

把新 DDI 源留一份:

bash 复制代码
mkdir -p ~/Library/Developer/CoreDeviceDDIs-Xcode27.1
cp -R "$SRC"/. ~/Library/Developer/CoreDeviceDDIs-Xcode27.1/

复发了直接重跑:

bash 复制代码
xcrun devicectl manage ddis update \
  --source-dir ~/Library/Developer/CoreDeviceDDIs-Xcode27.1 \
  --clean \
  --no-include-coredevice \
  --no-include-xcode \
  --timeout 300

想彻底断根,需要管理员密码:

bash 复制代码
sudo installer -pkg "/Applications/Xcode 27.1.app/Contents/Resources/Packages/XcodeSystemResources.pkg" -target /

二、macOS 27 模拟器打不开:不是重装,是 App Translocation

1. 现象

一运行 iOS 模拟器就弹:

text 复制代码
"Simulator"因为出现问题而无法打开。
请与开发者联系,以确保 Simulator 可以配合此 macOS 版本使用。

重装 Xcode、重装 Command Line Tools、删 DerivedData 都没用。

2. 崩溃日志里的真凶

看最新崩溃报告:

bash 复制代码
ls -lt ~/Library/Logs/DiagnosticReports/ | grep -i simulator

关键字段:

text 复制代码
procPath: /private/var/.../T/AppTranslocation/<UUID>/d/Simulator.app/Contents/MacOS/Simulator
termination.indicator: Library missing
Library not loaded: @rpath/SimulatorKit.framework/Versions/A/SimulatorKit

也就是说:Simulator.app 被 Gatekeeper 随机挂载到只读路径 ,启动时 dyld 找不到 SimulatorKit.framework,直接 SIGABRT。

3. 为什么偏偏 Simulator.app 中招?

Simulator.app 是 Xcode 里的嵌套 app:

text 复制代码
/Applications/Xcode.app/Contents/Developer/Applications/Simulator.app

它没有把 SimulatorKit.framework 打在自己 bundle 里,而是靠相对路径回溯 Xcode 内部私有框架。

一旦被 App Translocation 随机转位,父目录结构变了,相对回溯断裂,就找不到框架。

4. 确认隔离属性

bash 复制代码
xattr -p com.apple.quarantine /Applications/Xcode.app 2>&1
xattr -p com.apple.quarantine /Applications/Xcode.app/Contents/Developer/Applications/Simulator.app 2>&1

如果输出类似:

text 复制代码
com.apple.quarantine: 00c1;...

就是它。常见来源是 AirDrop、U 盘、旧备份拷贝,且没被 Finder 正式认可。

5. 推荐修复:清顶层隔离属性

bash 复制代码
xattr -d com.apple.quarantine "/Applications/Xcode.app"
xattr -d com.apple.quarantine "/Applications/Xcode.app/Contents/Developer/Applications/Simulator.app"

注意:

  • 只删这两个顶层路径;
  • 不要一上来递归整个 Xcode;
  • 一般不需要 sudo,权限不足再加。

不想敲命令,也可以在 Finder 里双击打开一次 Xcode.app,或拖到桌面再拖回 /Applications,让系统"认可"。

还不行再重建 Launch Services:

bash 复制代码
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister \
  -kill -r -domain local -domain system -domain user

最后才考虑:

bash 复制代码
sudo xattr -dr com.apple.quarantine "/Applications/Xcode.app"

6. 验证

bash 复制代码
open -a "/Applications/Xcode.app/Contents/Developer/Applications/Simulator.app"
pgrep -fl "Simulator.app/Contents/MacOS/Simulator"
xcrun simctl list devices | grep -i booted
ls -lt ~/Library/Logs/DiagnosticReports/ | grep -i simulator

期望:

  • 进程路径是真实 /Applications/Xcode.app/...;
  • 有设备 Booted;
  • 没有新增 Simulator-*.ips。

7. 延伸坑:模拟器能开 ≠ App 能跑

macOS 27 上可能只剩 arm64-only 模拟器 runtime。老 fat 库如果缺 arm64-simulator 切片,会报:

text 复制代码
building for iOS Simulator, but linking in object file built for iOS

务实解法:

  1. 直接用真机调试;
  2. 装带 Rosetta 的 Universal iOS 模拟器 runtime;
  3. 推动 SDK 提供 .xcframework 并补 arm64-simulator 切片。

另外:

  • 不要随手删 /Library/Developer/CoreSimulator 下的 runtime 目录。

三、最后给一份排查清单

真机问题:

bash 复制代码
xcrun devicectl list devices -v
xcrun devicectl list preferredDDI
xcrun devicectl device info lockState --device <UDID> --timeout 25
xcode-select -p

模拟器问题:

bash 复制代码
ls -lt ~/Library/Logs/DiagnosticReports/ | grep -i simulator
xattr -p com.apple.quarantine /Applications/Xcode.app 2>&1
xattr -p com.apple.quarantine /Applications/Xcode.app/Contents/Developer/Applications/Simulator.app 2>&1

记住两句话:

真机报"未配对",先查 DDI 兼容性。

模拟器打不开,先看崩溃路径有没有 AppTranslocation。

这两步能省下大量重装和重置的时间。

相关推荐
开心猴爷2 小时前
iOS 上架 App 流程
后端·ios
奶油话梅糖3 小时前
用 iPhone 扫一间房,AI 帮你在浏览器里 1:1 重建它:Wes Bos 的 scan-to-threejs 工作流
人工智能·ios·iphone
茶底世界之下9 小时前
阴天窗边的柿子:用 Awaking 让暖色成为主角
ios·app·产品
kango1 天前
iOS 远程推送全链路拆解:从 deviceToken 到多账号绑定
ios·app
茶底世界之下1 天前
仙人掌与沙丘的傍晚:用 Awaking 让侧光有了层次
ios·app·产品
茶底世界之下2 天前
蓝调鱼市的一盏暖灯:用 Awaking 把冷海与灯光分开
ios·app·产品
茶底世界之下3 天前
窗边白雏菊与旧书:用 Awaking 留住一束暖光
ios·app·产品
茶底世界之下4 天前
阴天海边的蓝船:用 Awaking 把灰蓝调成清亮主角
ios·app·产品
Digitally5 天前
如何将 iPhone 备份到 iCloud?
ios