截至 2026 年 8 月 21 日,Apple 官方系统要求页面列出的最新测试工具链是 Xcode 27 beta 4,支持 iOS 27 Simulator,并要求 macOS Tahoe 26.4 或更高版本。查看 Apple 的版本与系统要求
结论先说:遇到 iOS 27 模拟器磁盘不足,不要先删整个 Developer 目录。先在 Xcode Components 和磁盘目录中确认空间到底被 Simulator Runtime、模拟设备数据、DerivedData、Archives 还是依赖缓存占用;只删除不在测试矩阵内、且可以重新下载或重新生成的内容。若多版本测试和持续构建仍会反复耗尽空间,就应该扩容或迁移到容量更合适的远程 Mac,而不是重复激进清理。
最后更新于 2026 年 8 月 21 日,版本状态核实自 Apple Xcode 系统要求、Xcode 27 Beta Release Notes 与 Xcode Components 管理文档。
01 谁需要这份磁盘维护方案
如果你只维护一款 iOS App,希望在本地保留最小模拟器环境,这篇文章可以帮你避免误删后重新下载整套工具链。
如果你需要同时验证多个 iOS 版本,不能随意删除 Runtime,重点看测试矩阵和回归成本。
如果你把远程 Mac 用作持续构建或模拟器测试主机,还需要额外管理归档、日志、依赖缓存和重启后的数据持久性。
02 iOS 27 模拟器磁盘不足的占用边界
“模拟器占满磁盘”通常不是单一目录造成的。Xcode、Simulator 和构建系统会分别保存不同类型的数据,处理方式也不同。
| 占用类型 | 主要作用 | 是否可直接删除 | 删除后的影响 |
|---|---|---|---|
| Simulator Runtime | 提供某个 iOS 版本的模拟系统 | 可以,但应从 Xcode Components 删除 | 该版本的所有模拟设备都无法启动,需要重新下载 |
| 模拟设备数据 | 保存某个 iPhone 或 iPad 模拟设备的应用、设置和测试数据 | 通常可以 | 只影响被删除设备的数据,不等于卸载 Runtime |
| DerivedData | 保存项目编译中间产物、索引和部分构建结果 | 通常可以 | 下次构建需要重新编译,首次构建可能更慢 |
| Archives | 保存可验证、导出或上传的归档 | 谨慎删除 | 失去旧版本回溯、重新上传和问题复现材料 |
| 依赖缓存 | 保存 Swift Package、工具或项目依赖下载结果 | 视项目而定 | 可能触发重新下载,离线构建可能失败 |
| 签名材料 | 证书、Provisioning Profile、密钥链相关内容 | 不要当缓存删除 | 可能导致签名、导出或上传失败 |
Apple 将 Simulator Runtime 定义为模拟器启动时加载的操作系统包,同一个 Runtime 可以被多个不同设备类型的模拟器共用。因此,删除一个模拟设备,不会达到卸载完整 Runtime 的效果;反过来,删除 Runtime 会同时影响依赖该系统版本的多个模拟设备。查看 Simulator Runtime 与设备管理说明
先判断失败发生在哪个阶段
- 下载阶段失败:优先检查可用空间、网络临时文件和当前 Xcode 版本是否支持该组件。
- 构建阶段失败:重点查看 DerivedData、编译缓存、依赖缓存和项目输出目录。
- 模拟器启动阶段失败:重点检查目标 Runtime、设备数据、活动 Xcode 路径和模拟器状态。
- Archive 阶段失败:不要只删除模拟器数据,因为正式归档应使用真实设备或构建专用设备目标,不是普通 Simulator 运行目标。Apple 关于 Archive 条件的说明
先打开“系统设置 → 通用 → 存储空间”,观察“开发者”或开发工具相关项目是否明显增长。然后在 Xcode 中进入“Xcode → 设置 → Components”,查看每个已安装组件可以回收的空间。Apple 的 Components 页面会列出已安装组件以及移除后可恢复的存储空间。查看 Components 的官方操作
03 单 App 开发者的最小环境
只维护一款 App 时,最容易犯的错误是保留所有历史 Runtime,以为以后可能用到。更稳妥的做法是先记录项目实际支持的最低版本、当前主测版本和 iOS 27 适配目标,再决定保留哪些组件。
建议先建立一份简单清单:
- ✅ 保留当前项目实际使用的 iOS 27 Simulator Runtime。
- ✅ 保留仍在支持范围内、且近期会回归测试的最低版本 Runtime。
- ✅ 保留最近发布版本需要复查的 Archives。
- ✅ 保留项目锁定的依赖版本和可自动恢复的依赖来源。
- ❌ 不要因为目录名称带有
Developer就整目录删除。 - ❌ 不要把签名证书、Provisioning Profile 或钥匙串内容当作缓存处理。
- ❌ 不要为了释放空间直接关闭 SIP,或删除受保护的系统目录。
Runtime 的安全清理
优先从 Xcode Components 删除不用的 Simulator Runtime。Apple 官方支持在“Xcode → 设置 → Components”中选择组件并点击删除,也支持添加此前发布的 Runtime。
如果你安装了正式版和 Beta 版 Xcode,清理前先确认两个环境是否共用同一套组件。不要把下面三件事混为一谈:
- 用
xcode-select切换命令行工具所使用的 Xcode。 - 从
/Applications/删除旧的 Xcode App。 - 从 Components 中删除 Simulator Runtime 或平台支持。
可以先执行:
xcode-select --print-path
这个命令只用于确认当前命令行工具指向哪个 Developer 目录,不会删除任何数据。若需要临时让某条命令使用 Beta Xcode,可以使用占位路径:
DEVELOPER_DIR="/Applications/Xcode-beta.app" xcodebuild -version
如果要永久切换活动 Xcode,则需要管理员权限:
sudo xcode-select --switch "/Applications/Xcode-beta.app"
xcode-select --print-path 用于查看活动 Developer 目录,--switch 用于切换默认 Xcode;它们与模拟器数据删除不是同一类操作。查看 xcode-select 官方说明
04 多版本兼容测试者的保留矩阵
如果你的 App 需要同时验证最低支持版本、主要用户版本和 iOS 27 适配,不能只按“哪个 Runtime 最大就删哪个”来操作。删除前先把测试需求拆成三类:
| 测试目标 | 应保留的内容 | 可以优先清理的内容 | 判断依据 |
|---|---|---|---|
| 日常开发 | 当前主测 Runtime、少量常用设备 | 不使用的模拟设备、旧 DerivedData | 是否能完成日常运行和调试 |
| 版本兼容 | 最低支持版本、主要用户版本、iOS 27 Runtime | 不在回归矩阵内的设备数据 | 下一轮回归是否仍需要该版本 |
| 发布前验证 | 发布目标对应环境、最近归档、签名材料 | 过期构建缓存、无复现价值的旧设备 | 是否需要重新验证或回溯历史版本 |
删除单个模拟设备适合处理“设备太多、测试数据膨胀”的情况。进入“Window → Devices and Simulators”,选择不再使用的设备并删除即可。这个操作通常不会卸载对应 Runtime。
卸载完整 Runtime 适合处理“某个系统版本已退出测试矩阵”的情况。它释放的空间更直接,但该版本下所有模拟设备都会失去可启动基础。Apple 也说明,Runtime 与具体设备型号是分开的:一个 Runtime 可服务多个模拟器设备类型。
05 Xcode DerivedData、Archives 与依赖缓存
DerivedData 清理边界
清理 DerivedData 一般不会删除项目源码,也不会自动删除签名证书。它主要影响编译中间产物、索引和项目生成结果。下次打开项目或执行构建时,Xcode 需要重新生成这些内容。
你可以先在 Xcode 的设置中查看项目使用的 DerivedData 位置,再按项目或时间范围处理。不要在构建任务正在运行时删除,也不要把整个用户目录作为清理目标。
对于单个项目,可以采用“先关闭 Xcode → 记录当前路径 → 备份必要日志 → 删除对应项目目录 → 重新打开并构建”的顺序。项目名和用户目录使用占位符时,可按下面形式确认路径:
du -sh ~/Library/Developer/Xcode/DerivedData/<项目名>-*
这条命令只查看目录大小。确认目标后再进行删除,避免误删其他项目的编译结果。
Archives 不要按缓存处理
Archive 是可以用于验证、导出和上传的构建归档。Apple 文档说明,Xcode 会把归档保存到 Archives organizer,方便之后再次分发或检查。查看 Archive 与分发流程
建议按用途分层:
| 归档类型 | 建议保留方式 | 清理前确认 |
|---|---|---|
| 当前 App Store 版本 | 至少保留发布对应归档 | 是否仍需重新上传或复现问题 |
| 最近 TestFlight 版本 | 保留最近一批有测试价值的归档 | 团队是否仍在使用对应构建号 |
| 过期调试归档 | 可删除或导出到外部存储 | 是否还有崩溃复现或审核追踪需求 |
| 未完成签名的临时归档 | 优先确认是否能重新构建 | 是否包含无法恢复的构建环境 |
如果你依赖归档排查线上崩溃,不要为了短期空间直接全部删除。先导出必要的符号文件和构建记录,再处理确定没有回溯价值的版本。
依赖缓存的恢复风险
Swift Package、二进制依赖和项目脚本缓存可能不属于 Simulator Runtime,但持续构建时同样会增长。清理前确认:
- 依赖是否能从远程仓库重新下载。
- 构建主机是否允许访问依赖源。
- 是否存在锁定版本和私有依赖。
- 无网络时是否仍需要完成紧急构建。
- 清理后是否会让多个项目同时重新下载,造成构建队列堆积。
如果你把 Mac 作为 iOS 打包服务器 使用,缓存清理应安排在构建窗口之外,并保留一次完整依赖恢复记录。
06 双 Xcode 环境与 Beta 组件
Xcode 27 Beta 面向 iOS 27 等新 SDK 和测试环境。Apple 的 Release Notes 说明,Xcode 27 Beta 包含 iOS 27 SDK,并要求 macOS Tahoe 26.4 或更高版本;Beta 的组件界面和已知问题仍可能变化。查看 Xcode 27 Beta Release Notes
如果你同时安装正式版和 Beta 版,建议保留以下边界:
- 生产发布使用固定的正式版 Xcode。
- iOS 27 适配和新 API 验证使用 Xcode 27。
- 通过
xcode-select --print-path检查自动化任务当前指向。 - 在脚本中使用
DEVELOPER_DIR,避免无人值守任务误用 Beta。 - 删除 Beta 环境前,确认下一轮测试是否可以重新下载 Runtime。
- 不要因为切换了 Xcode,就认为旧 Runtime 或旧 Archives 会自动消失。
对于 Beta 版本,论坛中的孤立 Runtime、权限异常或异常占用只能作为用户报告,不能直接推导为所有 Mac 都存在的问题。
07 远程 Mac 的持续构建维护
远程 Mac 磁盘经常被模拟器占满时,问题通常不是“远程”二字本身,而是缺少水位和恢复策略。无人值守构建至少要记录以下状态:
| 维护对象 | 需要记录的状态 | 触发动作 |
|---|---|---|
| 可用空间 | 当前剩余空间和连续下降趋势 | 低于团队设定阈值时暂停非必要构建 |
| Runtime | 已安装版本与测试矩阵对应关系 | 删除不再测试的版本,保留主测版本 |
| 模拟设备 | 设备名称、系统版本和测试数据用途 | 删除孤立设备,保留自动化脚本使用的设备 |
| Archives | 最近发布版本和回滚需要的归档 | 导出必要材料后轮换旧归档 |
| 日志 | 构建日志、模拟器日志和失败记录 | 按日期轮换,保留失败复现所需部分 |
| 依赖缓存 | 缓存来源、锁定版本和恢复方式 | 先验证可重建,再删除缓存 |
在迁移或扩容前,先验证三件事:
- 重启后 Runtime、模拟器设备和项目文件是否仍然存在。
- 你的账户是否有安装组件、切换 Xcode 和运行构建所需权限。
- 删除组件后,能否通过 Xcode Components 或
xcodebuild重新安装。
如果你正在维护远程环境,建议先阅读 远程 Mac 的容量与租期选择,用真实项目测试一次完整构建、模拟器启动和 Archive,再决定是否长期迁移。你也可以先用短周期方案验证磁盘增长速度,而不是凭一次清理结果估算长期容量。
08 清理、扩容还是迁移:决策表
| 你的实际情况 | 优先方案 | 不建议的做法 | 验收标准 |
|---|---|---|---|
| 只有旧设备数据和一次性 DerivedData 膨胀 | 清理 | 删除全部 Runtime | 项目可重新构建,模拟器可启动 |
| 需要保留多个 iOS 版本,但缓存反复增长 | 定期轮换缓存并保留测试矩阵 | 每次构建后暴力删除所有目录 | 回归版本仍完整,构建可自动恢复 |
| iOS 27 Runtime、旧版本 Runtime 和 Archives 必须共存 | 扩容 | 反复卸载核心 Runtime | 多版本测试和发布归档可同时完成 |
| 远程主机重启后环境丢失或权限不足 | 迁移 | 继续堆叠临时修复命令 | 重启、重装、构建和上传流程可重复 |
| 需要物理 iPhone、专用外设或本地 USB 调试 | 本地 Mac 或混合方案 | 完全依赖远程模拟器 | 真实设备测试链路不被阻断 |
清理完成后,不要只看 Finder 里多出了多少空间。至少执行一次真实项目验收:
- ✅ 依赖可以按锁定版本恢复。
- ✅ Xcode 能打开项目或工作区。
- ✅ iOS 27 Simulator Runtime 能启动目标设备。
- ✅ 项目可以完成一次干净构建。
- ✅ 必要的 Archive 可以生成并出现在 Organizer。
- ✅ 签名材料仍然可用,不能只验证 Debug 构建。
- ✅ 重启 Mac 后再次运行构建任务。
- ✅ 观察一段时间后,空间没有因缓存或日志立即回升到危险水位。
模拟器并不能完全替代真实设备。Apple 明确提醒,Simulator 运行在 Mac 上,不能复制所有真实硬件性能和硬件特性;涉及相机、推送、传感器、性能和系统行为时,仍应安排真实设备验证。查看 Apple 关于模拟器限制的说明
09 当前 Mac 与远程 Mac 的取舍
如果你当前的 Mac 只是偶尔做 iOS 27 适配,清理一次可恢复缓存通常比迁移更简单。但如果本地磁盘长期同时承载多个 Runtime、Archives、依赖缓存和日常文件,反复清理会带来三个真实问题:构建被迫重新编译,旧版本回归环境被误删,发布前还要重新下载组件。
把模拟器和持续构建放到容量更合适的远程 Mac,可以把开发机与构建环境分开,减少本地磁盘被工具链持续侵占的情况。不过,远程方案也不适合所有人:需要物理接口、本地真实设备调试,或长期稳定运行高负载任务的人,仍应优先评估自购 Mac 或混合架构。
如果你的目标是临时验证 iOS 27 兼容性、短期保留多版本 Runtime,或先确认项目每天会增长多少缓存,可以查看 CALMVPS 的远程 Mac 方案,先用真实项目完成一次构建和重启验收。这样得到的结论,比清理后短暂增加的可用空间更接近你的长期运维需求。