环境:macOS 27 / Xcode 26.6 + Xcode 27.1 / iPhone 12 iOS 26.6
关键词:DDI、CoreDevice、devicectl、App Translocation、Gatekeeper、SimulatorKit
最近在 macOS 27 上踩了两个很典型、但报错方向都很"误导"的坑:
- Xcode 真机报
must be paired/Failed to find a DDI,但配对根本没坏; - 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
务实解法:
- 直接用真机调试;
- 装带 Rosetta 的 Universal iOS 模拟器 runtime;
- 推动 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。
这两步能省下大量重装和重置的时间。