Apple 在 Xcode 27 里悄悄塞了个独立 App 叫 Device Hub:把过去散在 Xcode 的 Devices & Simulators 窗口、Simulator.app、xcrun simctl 命令行三处的设备管理,合成一个单独能跑、不用开 Xcode 的应用。你不用装、不用 clone——它随 Xcode 附带,Xcode → Open Developer Tool → Device Hub 就开。它同时管模拟器和真机,同一套工具,物理机和模拟器行为完全一致。配一个叫 devicectl 的命令行工具,把「连设备、抓诊断、传文件」这套动作做成能写进 CI 脚本的命令。
一、它到底是啥:合并三件套的独立设备管理 App
老痛点是开发者都懂的:测真机要开 Xcode 的 Devices & Simulators,调模拟器要开 Simulator.app,写 CI 脚本用 xcrun simctl 还得配第三方的真机工具——多几台设备就得在几个窗口间切。Device Hub 的做法是把这三块收进一个 App:随 Xcode 27 安装,能脱离 Xcode 直接跑,面向「开发 app 的、跨设备配置测试的、管一批设备库存的」三类人。三个主区域,模拟器和真机通用:
- Sidebar(侧栏):全部设备 + 模拟器的清单,支持筛选、排序、分组;右键快捷动作(重启、一键把 iPhone 和 Apple Watch 模拟器配成对);多选可开多窗口并排对比 UI 适配。
- Canvas(画布):实时显示设备屏幕,可直接点击、拖、滚、用 Mac 触控板手势操作;上方工具条有放大、1:1 实物尺寸、自由 Resize、把 Mac 键盘输入直接喂给设备(测快捷键/外接键盘);底部控件随设备变(Apple TV 是播放/方向、Vision Pro 是环境/相机、Watch 是侧键+数字表冠)。
- Inspector(检查器):五个面板——外观(暗色/字号等即时改)、条件(模拟定位等)、音频、诊断(crash/spin 都在这里看)、Info/Apps/Profiles(存储型号序列号、装卸 app 含下载替换 data container、配置描述文件与证书)。
还分紧凑模式(在 Xcode 里 build & run 到模拟器时自动弹出的那个小窗,只有屏幕 + 几个底部控件)和完整模式(点开侧栏/画布/检查器三块),同一 App 两种密度。
二、devicectl:让设备管理能进 CI 的命令行(代码证据)
真正让工程师兴奋的是配的那个 devicectl——不开 Xcode 就能管物理 + 模拟设备,自动化的钥匙。官方文档实查到的真命令如下(这些是文档给的命令串,不是我本机跑通的):
# devicectl 真命令(官方文档实查,非本机跑通)
devicectl list devices # 列出所有设备 + 标识符(UUID/ECID/UDID/名字)
devicectl device info details # 硬件详情 / 元数据
devicectl device info # 查设备是否被锁
devicectl device install app # 装 app 到(物理)设备
devicectl device process launch <bundleID 或 path/MyApp.app>
# 可加 --environment-variables 传环境变量
devicectl device info files --domain-type systemCrashLogs
# 列崩溃日志,再 copy from 拉到 Mac
devicectl device copy to --source <Mac 路径> --destination <设备域>
devicectl device copy from --source <设备域> --destination <Mac 路径>
devicectl device info mountpoint # 某台设备挂载点
# 给脚本/CI 用:加 --json-output(版本化、向后兼容;官方明说别去 parse 终端输出)
# 起模拟器仍是 xcrun simctl;默认全设备挂载点 ~/Library/Developer/CoreDevice/DeviceFS
两个设计细节值得记:① 设备标识统一用 UUID / ECID / UDID / 名字 传给子命令,脚本里好定位;② 官方明写 自动化一律用 --json-output,别去 parse 终端文本输出(终端输出每个版本可能变,JSON 格式才版本化、向后兼容)。起模拟器仍走 xcrun simctl(老工具没废),默认全设备挂载点在 ~/Library/Developer/CoreDevice/DeviceFS。
三、它解决的那条真实 bug 复现流程(WWDC 26 session #260)
官方 WWDC 演示是一条完整的「跨人接力复现 bug」:工程师在 Apple Watch 真机上发现横屏文字被截断,用 Device Hub 无线配对 + 装 CoreLocation 日志 profile + 截 bug 图 + 触发 sysdiagnose + 下载 app data container 发给同事;同事在 iPhone 17e 模拟器上替换那个 data container、转横屏、把定位设到南非约翰内斯堡高空、字号拉最大——横屏 + 特定定位 + 最大字号三个条件同时满足,bug 复现。过去要切 Xcode、Simulator.app、命令行、Finder 四个工具,现在全在 Device Hub 一个 App 里走完。这是它「合并三件套」最具体的价值。
四、横向对比:它把旧的三件套怎么取代
- vs Xcode「Devices & Simulators」窗口:功能全搬进独立 App,还能脱 Xcode 单跑;vs Simulator.app:模拟器的管理/交互并进 Device Hub 的同一套 Canvas,不用再开独立模拟器 App 窗口;vs xcrun simctl:模拟器启动仍用 simctl,但物理设备的 copy/install/info/launch 统一收到
devicectl,一套命令模型。
五、坑与诚实边界(本机跑不了)
- 纯 Mac 工具:Xcode 27 + macOS,我本机是 Windows、没有 Xcode,跑不了 Device Hub 也跑不了 devicectl——所以第二节贴的
devicectl命令是官方文档实查的命令串,不是本机执行验证过的,别当实测。 - 无线配对有系统下限:iPhone/iPad 要 iOS/iPadOS 27 或更新才能无线配对,老系统只能走数据线;Apple Watch 要配对机上再配 watch,且 watch 和 iPhone 都要开 Developer Mode。
- tvOS / visionOS 走 Wi-Fi 广播要求网络开 IPv6(visionOS 在 Settings → General → Remote Devices,tvOS 在 Remotes and Devices)。
六、我的判断
Device Hub 的意义不在「多了个管理窗口」,而在把 iOS 开发者最碎的「设备 + 模拟器 + 命令行」三块拼成一个统一面,还给 CI 留了 devicectl 这个脚本化的口子。对一个常年跟一堆测试机打交道的 iOS 团队,它把「切四个工具复现一个 bug」压成「在一个 App 里点完」。但两条要拎清:① 它吃 Xcode 27 + macOS,Windows 环境(比如我本机)够不着,本篇只能基于官方文档 + WWDC session 拆机制、不能实测;② 无线配对被 iOS 27 卡了下限,老设备仍得插线。它不是「新能力」而是「把已有能力收拢」——价值在少切窗口,不在多一个功能。