先看 3 个证据点:项目能否编译、simctl 能否列出运行时、模拟设备能否启动。 如果 SDK 已存在但运行时清单为空,不要先重装 Xcode;先核对活动 Xcode、首次初始化、下载链路和 CoreSimulator 状态,再使用官方导出与导入路径恢复。经过多次清理仍无法在干净环境复现时,应更换节点,而不是继续删除系统目录。
这篇内容适合 3 类人:
- 升级 Xcode 26.6 后,无法下载或启动 iOS Simulator 的开发者。
- 需要批量准备远程 Mac 测试节点、避免每台机器重复下载运行时的 DevOps 工程师。
- 流水线可以编译,但无法执行 Simulator 测试的移动测试与发布工程师。
截至 2026 年 9 月 5 日,官方资料已提供 Xcode 设置界面、xcodebuild 下载、导出和导入 Simulator runtime 的支持路径。论坛中关于 Xcode 26.6 卡在 Preparing 的内容,目前只能作为个案现象线索,不能直接视为已确认的普遍故障。(developer.apple.com)
01 先把 SDK、运行时和设备状态拆开
Xcode 显示 iphonesimulator SDK,只能证明编译工具链找到了对应 SDK;它不等于 iOS Simulator runtime 已经安装。Simulator runtime 是设备启动时加载的操作系统包,设备列表、SDK 和 runtime 是不同层级。(developer.apple.com)
先在远程 Mac 上执行以下检查。命令中的路径和项目名称都使用你的实际值:
xcode-select -p
xcodebuild -version
xcodebuild -showsdks
xcrun simctl list runtimes
xcrun simctl list devices
按结果分流:
- 项目能编译,
xcodebuild -showsdks能看到 Simulator SDK,但simctl list runtimes显示为空:优先判断为 runtime 未安装或导入未完成,不要修改项目配置。 - runtime 能列出,但所有设备都是
Shutdown且启动失败:进入 CoreSimulator、运行时状态或设备数据排查。 - 设备可以启动,但真实项目测试失败:故障已经越过下载层,继续检查测试目标、签名、依赖、架构和 CI 环境。
xcodebuild、xcrun本身报错,或命令版本与图形界面不一致:先处理活动 Xcode 和首次初始化。
这一步的停止条件很重要:如果 SDK 与 runtime 的证据冲突,暂时不要删除 ~/Library/Developer、系统运行时目录或整个 CoreSimulator 数据库。你还没有证明问题发生在数据损坏层。
02 工具链错位会制造“下载失败”假象
多版本 Xcode 共存时,图形界面打开的应用,可能不是终端当前使用的 Developer Directory。尤其是在远程 Mac 上通过 SSH、VNC 和网页控制台交替操作时,用户容易在不同会话里调用不同版本的 xcodebuild。
在图形界面中确认你实际打开的是 Xcode 26.6,然后对照:
xcode-select -p
xcrun --find xcodebuild
xcrun --find simctl
xcodebuild -version
如果路径不是目标应用,再只对当前维护任务切换:
sudo xcode-select -s /Applications/<Xcode-26.6.app>
xcodebuild -runFirstLaunch
官方文档要求先选择目标 Xcode,再运行 xcodebuild -runFirstLaunch;首次初始化还会安装包括 simctl 在内的必要系统组件。(developer.apple.com)
不要在共享构建节点上把全局切换当成默认修复。更稳妥的做法是:
- 在脚本开头明确设置目标 Developer Directory。
- 使用绝对路径调用
xcodebuild和xcrun。 - 把
xcodebuild -version、xcode-select -p写入构建日志。 - 在切换后重新执行
xcrun simctl list runtimes。 - 通过一个最小项目确认编译和启动均使用同一套工具链。
如果 xcodebuild -runFirstLaunch 卡住,先保存完整终端输出。不要因为命令没有立即返回,就连续启动多个初始化进程;这可能让运行时挂载和组件安装更难判断。
03 Preparing 长时间不动时,先证明下载链路在哪里断了
Xcode 26.6 在 Preparing 阶段长时间没有进度,不能只看进度条判断。你需要区分 4 类可能性:
- 本地 DNS、代理、防火墙或 hosts 文件阻断。
- 组件目录请求成功,但下载任务没有落盘。
- 下载包已生成,但导入阶段失败。
- 当前服务或组件目录存在暂时性异常。
在 Xcode 的 Settings > Components 中记录目标平台、版本和界面提示。同时在终端尝试官方命令:
xcodebuild -downloadPlatform iOS \
-exportPath ~/Downloads/<simulator-export>
如果需要明确目标版本,可加入:
xcodebuild -downloadPlatform iOS \
-buildVersion <iOS-runtime-version> \
-exportPath ~/Downloads/<simulator-export>
官方支持使用 -downloadPlatform 下载指定平台,也支持通过 -exportPath 将组件导出到磁盘,再复制到其他 Mac 安装。架构变体可以使用 -architectureVariant universal 或 arm64,但必须结合目标节点架构和实际 Xcode 支持情况选择。(developer.apple.com)
你应当保留以下证据:
date
xcodebuild -version
xcode-select -p
df -h
scutil --dns
env | grep -i proxy
同时记录:
- 错误域名。
- 错误码和退出码。
- 开始与失败时间。
- 请求的 runtime 版本或 build。
- 导出目录是否仍为 0 字节。
- Xcode Components 页面是停在 Preparing、失败,还是显示已完成。
如果目录始终为 0 字节,问题更接近下载链路或组件服务,而不是 CoreSimulator 数据库。若导出包已经出现,则进入导入和识别排查,不要继续重复点击 Get。
论坛中的一个 Xcode 26.6 个案同时出现了 SDK 可见、simctl 无 runtime、界面长期 Preparing,以及命令行返回退出码 70 的组合;该内容没有得到官方普遍故障确认,因此只能作为取证模式参考。(developer.apple.com)
04 SDK 已安装但 Simulator runtime 不见了
这类情况的关键不是“重新安装 SDK”,而是确认运行时包是否真正完成安装。
先检查图形界面和命令行是否一致:
xcrun simctl list runtimes
xcodebuild -showsdks
然后在 Xcode 中打开 Settings > Components:
- 如果 iOS runtime 显示 Get:它尚未安装。
- 如果显示下载中:等待当前任务结束,并观察导出目录或系统日志。
- 如果显示已安装,但
simctl没有对应条目:可能是导入未完成、活动 Xcode 不一致,或运行时服务状态异常。 - 如果
simctl能列出 runtime,但没有可用设备:创建一个新的模拟设备进行验证。
设备创建和启动可以通过 Xcode 的 Window > Devices and Simulators 完成,也可以使用 simctl:
xcrun simctl create "<device-name>" \
"<device-type-identifier>" \
"<runtime-identifier>"
xcrun simctl boot "<device-udid>"
xcrun simctl list devices
设备类型标识符和 runtime 标识符不要凭记忆填写,先从本机清单中读取。不同 Xcode 和系统版本可用的设备、runtime 列表会变化,不能把网上旧命令直接复制到 2026 年的节点上。
如果 runtime 在组件界面存在,但设备启动失败,先退出 Xcode 和 Simulator,再重启 Mac 验证。官方资料说明,Simulator 在 Mac 上运行,并不等同于真实设备;硬件相关能力仍需真机验证。(developer.apple.com)
05 通过官方导出与导入恢复受限节点
在一台 Mac 上成功下载的 Simulator runtime,可以通过官方导出包在另一台符合条件的远程 Mac 上复用。不要直接复制某个 runtime 目录;更稳妥的做法是,在下载正常的 Mac 上导出平台组件,再在目标节点导入。
源 Mac:
xcode-select -s /Applications/<Xcode-26.6.app>
xcodebuild -runFirstLaunch
xcodebuild -downloadPlatform iOS \
-exportPath ~/Downloads/<export-directory> \
-architectureVariant <arm64-or-universal>
确认导出结果后,计算文件校验值:
shasum -a 256 ~/Downloads/<export-directory>/<export-bundle>
把导出的 .exportedBundle 或官方生成的组件文件通过受控渠道传到目标远程 Mac。目标节点执行:
xcode-select -s /Applications/<Xcode-26.6.app>
xcodebuild -runFirstLaunch
xcodebuild -importPlatform \
~/Downloads/<export-directory>/<export-bundle>
Xcode 26.4 的发布说明记录了 .exportBundle 导出格式,以及使用 xcodebuild -importPlatform 导入的示例。较早版本也明确说明,导出的 Simulator 磁盘镜像可以应用到其他 Xcode 安装,避免重复下载。(developer.apple.com)
导入后不要只看命令退出状态。按顺序复测:
xcrun simctl list runtimes
xcrun simctl list devices
xcrun simctl boot "<device-udid>"
同时记录:
- 源节点和目标节点的 Xcode 版本。
- runtime 平台、版本和 build。
- 架构变体。
- 导出文件校验值。
- 导入命令完整输出。
- 导入后
simctl的清单变化。
如果目标节点与源节点的 Xcode 主版本、系统版本或架构条件不一致,不要假设导出包一定兼容。先在一台非生产节点验证,再批量分发到 CI 节点。
06 破坏性清理只能放在末级
当 runtime 已下载、活动 Xcode 正确、首次初始化完成,但 CoreSimulator 仍无法识别时,才进入状态异常排查。
优先做低风险动作:
- 退出 Xcode、Simulator 和相关测试进程。
- 重启 Mac,等待系统服务完全恢复。
- 重新运行
xcodebuild -runFirstLaunch。 - 重新执行
xcrun simctl list runtimes。 - 删除并新建单个测试设备。
- 使用同一 runtime 运行最小项目。
不要一开始执行以下操作:
rm -rf ~/Library/Developer/CoreSimulator
sudo rm -rf /Library/Developer
sudo rm -rf /System/Library/AssetsV2
这些命令可能删除已有设备、测试数据、缓存和其他开发组件。执行前至少完成备份,并记录恢复入口、当前 Xcode 路径、runtime 导出包和项目依赖。没有这些资料,清理后你可能无法判断是原问题消失,还是整个基线被破坏。
某些版本的发布说明曾记录过 simdiskimaged 与 runtime 安装、simctl 卡住相关的问题,并给出过重启或重新安装运行时的处理方向。这类版本特定说明不能自动套用到 Xcode 26.6;你应以当前版本文档和实际日志为准。(developer.apple.com)
07 验收结果决定修复、重建还是换节点
不要以“Xcode 能打开”作为修复完成标准。远程 Mac 还要经受 SSH 断线、Mac 重启和 Xcode 重新启动后的复测。
远程节点验收清单
- ✅
xcode-select -p指向预期的 Xcode 26.6。 - ✅
xcodebuild -version与图形界面版本一致。 - ✅
xcodebuild -showsdks能看到目标 Simulator SDK。 - ✅
xcrun simctl list runtimes能列出目标 iOS runtime。 - ✅ 可以创建并启动一个全新的模拟设备。
- ✅ 最小项目可以完成编译、安装和测试。
- ✅ 真实项目可以执行至少一组 Simulator 测试。
- ✅ SSH 断线后,后台任务不会因为终端关闭而消失。
- ✅ Mac 重启后,runtime 仍能被识别。
- ✅ Xcode 重新启动后,运行目标仍然可用。
- ✅ CI 使用的用户、路径和权限与手工验收一致。
如果只有下载失败,但离线导入成功,说明节点仍可继续使用,不过应保留导出包和校验记录。若导入成功但重启后 runtime 消失,说明节点基线不可信,优先隔离重建。若干净节点也无法下载,且多个时间点复测得到相同域名或错误码,再考虑暂缓批量部署,而不是同时清理所有节点。
修复路径对比
| 现象与证据 | 首选动作 | 风险 | 继续条件 |
|---|---|---|---|
| SDK 可见,runtime 清单为空 | 使用 Components 或 xcodebuild -downloadPlatform |
低 | 导出目录出现文件或下载成功 |
xcode-select 与图形界面不一致 |
只切换当前任务的 Developer Directory | 低 | xcodebuild -version 与界面一致 |
| Preparing 长时间不变,导出目录为 0 字节 | 检查 DNS、代理、防火墙、hosts 和错误域 | 中 | 能复现网络请求或获得明确错误 |
runtime 已下载,simctl 不识别 |
重启、重新初始化、核对活动 Xcode | 中 | runtime 清单恢复 |
| 可下载节点正常,目标节点受限 | 官方导出后校验并导入 | 低至中 | 目标节点能列出并启动 runtime |
| 多次清理后仍无法建立基线 | 在干净节点复现,必要时换节点 | 低 | 新节点通过真实项目和重启验收 |
继续修复还是更换节点
| 决策信号 | 继续修复 | 隔离重建 | 更换远程 Mac 节点 |
|---|---|---|---|
| SDK 与 runtime 状态 | 仅一层异常,证据清楚 | 多层状态互相矛盾 | 新节点可正常识别 |
| 下载链路 | 能稳定导出或导入 | 只能偶尔成功 | 多次复测均失败 |
| CoreSimulator | 重启后恢复 | 清理后仍需反复修复 | 干净节点一次通过 |
| CI 复测 | 真实项目测试稳定 | 只适合临时手工测试 | 需要长期无人值守运行 |
| 运维成本 | 日志和恢复入口完整 | 缺少可审计基线 | 原节点已被多次重装或删除 |
单纯因为 iOS Simulator 下载失败,通常没有必要立即重装 Xcode。只有在 Xcode 应用本身损坏、xcodebuild 无法正常运行、首次初始化持续失败,或干净路径安装后问题稳定消失时,重装才有明确证据支持。Components 页面卡在 Preparing,本身不足以证明 Xcode 应用已经损坏。
如果你正在搭建长期的 远程 Mac 开发环境,建议把 Xcode 版本、runtime 导出包、校验值和验收脚本纳入节点交付记录。需要批量建立环境时,也可以先查看 CALMVPS 的 Mac 方案与价格,再按测试周期选择临时节点或持续运行节点。
当前方案如果是反复重装本地 Xcode、依赖不稳定的共享云环境,常见缺点是:运行时重复下载、失败后缺少完整日志、节点重启后状态不可预测,以及团队成员无法复用同一份干净基线。若原 Mac 已被多次清理,无法证明当前环境是否完整,先租用一台干净的远程 Mac,复现下载、官方导入和真实项目测试,再决定是否重建原节点,通常比继续破坏性排查更容易控制风险。需要临时算力、隔离的 Xcode 测试环境或一台 7×24 小时在线的构建节点时,CALMVPS 的远程 Mac 会比继续维护一台状态不明的机器更适合做这次恢复验证。