升级 Xcode 27 后,flutter devices 找不到模拟器,或命令无法启动设备。
本周建议:先升级或固定到包含 DeviceHub.app 路径支持的 Flutter 3.47.0,再核对当前选中的 Xcode 和模拟器运行时;暂时不要删除设备数据或重装 Xcode。 Flutter 官方发布说明记录了这项路径变更,但它并不意味着所有模拟器故障都会自动消失。

这篇适合升级 Xcode 27 后发现 flutter devices 异常的 Flutter 开发者。
如果远程 Mac 上构建成功、模拟器步骤失败,CI 工程师可以用下文区分工具路径和运行时问题。
维护共享节点的平台工程师,也可以据此先取证,再决定是否调整环境。

先划分故障阶段:构建、发现和启动不是一回事

Xcode 构建成功,不代表 Flutter 一定能列出模拟器;Flutter 能列出设备,也不代表设备可以顺利启动。把现象分成三个阶段,可以避免把所有问题都归咎于同一个工具:

  • 构建阶段:项目能否通过 flutter build ios 或 xcodebuild 编译?
  • 发现阶段:flutter devices 是否列出目标模拟器?Xcode 自身的设备管理入口是否能看到它?
  • 启动阶段:Flutter 能发现设备后,flutter run -d <设备 ID> 是否仍无法启动?

Xcode 27 使用 Device Hub 管理设备与模拟器;Flutter 官方 iOS 开发文档也将启动入口从较早版本的 Simulator 应用区分为 Xcode 27 的 Device Hub。若旧版 Flutter 工具仍按 Simulator.app 路径查找模拟器,就可能出现构建正常、Flutter 却无法发现或启动设备的情况。(Flutter iOS 开发文档;Apple 对 Xcode 27 的介绍)

Flutter 3.47 与 Xcode 27 的模拟器路径适配

Flutter 3.47.0 的发布说明列出了一项针对 Xcode 27 的工具变更:Flutter 工具使用 DeviceHub.app 路径查找 iOS 模拟器。Flutter 仓库中记录的对应问题也描述了旧路径与新应用入口的变化。(Flutter 3.47.0 发布说明;Flutter 对应问题记录)

因此,如果你用的是早于该修复的 Flutter SDK,优先更新或固定到含有这项变更的版本,再复测发现结果。若已经使用 Flutter 3.47.0,却仍然找不到设备,不要重复升级了事:继续确认 Flutter 命令实际调用的 SDK、Xcode 选择及运行时状态。

⚠️ 不要把“Device Hub 已打开”当作修复完成。图形入口能打开,只能说明应用能启动;Flutter 是否使用兼容路径,以及 Xcode 是否识别了对应运行时,仍需分别验证。

用时间线核对版本与工具路径

按以下里程碑记录结果。比较重点不是你“装过什么”,而是本机终端、IDE 和 CI Runner 实际调用了什么。

检查阶段 命令或入口 结果如何解释
Flutter SDK flutter --version、which flutter 记录版本及可执行文件路径;确认终端调用的版本包含 DeviceHub.app 路径支持
当前 Xcode xcode-select -p、xcodebuild -version 检查 Developer 目录与版本是否指向预期安装位置
运行时与设备 xcrun simctl list devices available 如果没有目标设备,先检查所选 Xcode 是否识别所需运行时
图形入口 open -a DeviceHub 用 Xcode 27 的设备管理入口单独验证设备是否可见
Flutter 发现与启动 flutter devices、flutter run -d <设备 ID> 区分设备未发现与发现后启动失败

Flutter 官方文档列出 iOS 工具链配置方式;Apple 说明,simctl、xcodebuild 等命令随 Xcode 提供,调用前需要将预期版本设为当前 Developer 目录。表格里的命令是分层取证,不是要求你一次性重装或重置工具链。(Apple Xcode 命令行工具参考)

Flutter 能发现设备,但模拟器仍无法启动

如果 flutter devices 已列出目标设备,问题就不再是单纯的应用路径发现。先用 Device Hub 复测设备状态,再检查当前 Xcode 是否安装并识别项目所需的模拟器运行时。Apple 文档说明,运行时可以从 Xcode 的组件设置安装,也可通过 xcodebuild 下载;如果缺少目标平台组件,创建项目或运行目标时也可能提示下载。(Apple 模拟器组件安装说明)

若 Device Hub 看得到目标、simctl 也能列出,但 Flutter 启动失败,保存完整命令和错误日志,并确认 Flutter、IDE 与 Runner 没有分别指向不同的 Xcode。若设备列表本身缺少目标,则回到运行时状态,不要先删模拟器数据。

Apple 的 Xcode 27 发布说明还记录了安装时序曾导致模拟器设备不出现在 Device Hub 的问题及修复。这说明即使 Flutter 路径正确,Xcode 侧的设备展示也可能独立出错;不能由某个单一症状推断问题必然来自 Flutter。(Apple Xcode 27 发布说明)

共享节点提醒:先保存 Flutter 版本、可执行文件路径、xcode-select -p 输出和失败日志。清理缓存、删除设备或重装会改变现场;如果之后才发现 CI 使用了另一套 SDK,就更难还原原始故障。

远程 Mac CI 先比对执行入口,再改共享环境

远程 Mac 上同一台机器可能有交互式终端、IDE 和 CI Runner 等执行入口。它们可能使用不同账户、不同 PATH,或选中不同的 Flutter SDK 与 Xcode;你在终端里修好路径,不等于 Runner 也使用同一套工具。

请在真正失败的 Runner 作业里输出并保存以下信息,再与本机终端的结果对照:

  • which flutter 与 flutter --version
  • xcode-select -p 与 xcodebuild -version
  • flutter doctor -v 的 iOS 工具链部分
  • flutter devices 输出及模拟器启动时报错

Flutter 官方 iOS 配置文档给出了 Xcode 命令行工具的选择与初始化步骤;不要在共享节点上仅凭版本号就假定开发目录一致。如果确实需要切换 Xcode,先确认改动范围和回退路径,再在目标 Runner 环境验证。问题还未定位前,避免同时升级 Flutter、切换 Xcode 和删除运行时,否则一次变更后即使故障消失,也无法判断是哪项操作起作用。

验收清单:用真实项目走完发现到测试

  • [ ] 在本机终端记录 flutter --version 和 which flutter。
  • [ ] 在失败的 IDE 或 CI Runner 中重复记录同样的信息,确认调用的是预期 Flutter SDK。
  • [ ] 记录 xcode-select -p 与 xcodebuild -version,确认当前选择的是目标 Xcode。
  • [ ] 用 xcrun simctl list devices available 检查目标设备,并确认所需运行时已安装。
  • [ ] 通过 Device Hub 单独复测设备,再运行 flutter devices,分别保留两边结果。
  • [ ] 在真实项目中执行 flutter run -d <设备 ID> 和项目已有的模拟器测试任务。
  • [ ] 只有在证据指向对应层之后,才修正 Flutter 路径、切换 Xcode 或安装运行时;每项变更后单独复测。

若 Flutter 发现设备失败,而 Xcode 能正常看到设备,优先查 SDK 版本与工具路径;若 Xcode 自身也看不到目标,先查运行时和 Xcode 环境;若两边都能发现但应用起不来,再分析启动日志及项目配置。在删除设备数据或重装 Xcode 前,保存日志与当前配置,并确认重建后能恢复所需运行时。

最后更新于 2026 年 9 月 30 日;版本行为核实自 Flutter 官方发布说明、iOS 开发文档、Apple Xcode 27 发布说明及 Flutter 问题修复记录。Flutter 或 Xcode 后续更新路径说明时,应在目标组合上重新验证。

如果你目前用 Linux 云主机跑 iOS 流程,它无法替代 macOS 上的 Xcode 工具链;如果依赖一台本地 Mac 排查,升级或路径切换也会占用这台机器,并可能影响原有工作流。远程 Mac 节点可以提供独立的 macOS 执行环境,但仍要按你的 Flutter 项目、Xcode 选择和模拟器运行时完成验收;若任务长期持续、必须连接本地物理设备,先评估自购 Mac 或其他适配方案。临时调试或 CI 验证前,可先查看 VMSPIN 的远程 Mac 方案与套餐价格,再用真实项目测试是否符合你的工作方式。