告别 Xcode 模拟器卡顿与繁琐:Baguette 无头 iOS 模拟器管理器与 Web UI 深度体验

在 iOS 开发与自动化测试领域,官方的 Simulator.app 长期以来让开发者又爱又恨:它必须占用沉重的桌面图形窗口、多设备并发性能消耗巨大、无法原生透传 Mac 摄像头、且在远程协作或 CI/CD 无头(Headless)环境下极难管理。此外,随着 AI Agent(如 Claude Code、Cursor 等)在编程与自动化测试中的普及,如何让 AI 高效、低延迟地感知并操作 iOS 界面,成为了一个迫切的需求。

今天介绍一个堪称“降维打击”的开源极客神器 —— Baguette(法棍 🥖)。它是一个完全无需打开 Xcode 或 Simulator.app无头(Headless)iOS 模拟器管理器 + 独立 Web UI

先上一段官方实操与多端流式推流演示:


1. Baguette 是什么?

Baguettetddworks/baguette)由纯 Swift 编写,专为 Apple Silicon 和 macOS 打造。它直接链接 Xcode 的私有框架(SimulatorKitCoreSimulatorIOSurfaceVideoToolbox 等),实现对 iOS 模拟器的底层直控。

通过一个轻量的 CLI 工具(baguette)和一个内嵌的高性能 Web 服务器,你可以在纯终端或任何现代浏览器中,获得完整的 iOS 模拟器控制体验。


2. 核心硬核特性剖析

2.1 60 FPS 极速低延迟画面串流(Frame Streaming)

  • 支持 MJPEGH.264 / AVCC 流式输出,通过 WebSocket 或 stdout 传输;
  • 支持动态调节分辨率、帧率与码率;
  • 在 Web 端实时渲染 iOS 设备外壳(Bezel)与手势轨迹,甚至支持在浏览器中一键录制生成带设备外壳的高清 MP4 演示视频。

2.2 原生 Host-HID 物理触控与按键注入

Baguette 绕过了传统的 UI 窗口,直接调用 SimulatorKit 的私有符号和 IOHIDDigitizerDispatch

  • 全面手势支持:单指轻点、双击、滑动、双指捏合(Pinch)、旋转与拖拽;
  • 系统级手势:支持底部 Home 条上滑、多任务切换器(App Switcher)、锁屏与通知中心下拉;
  • 实体物理按键:音量加减、锁屏/电源键、Action Button,甚至 Apple Watch 的数码表冠与侧边按键;
  • 免 Dylib 注入:无需复杂的 DYLD_INSERT_LIBRARIES 注入即可原生触发 iOS 真实的手势识别器。

2.3 黑科技:Mac 摄像头直通模拟器(Webcam Pipe)

在以往,模拟器里调试相机相关功能(如二维码扫描、身份证识别、AR 或实时滤镜)极为痛苦。

  • Baguette 引入了虚拟相机管道,将 Mac 物理摄像头(或外接相机)采集的 BGRA 帧通过共享内存环形缓冲区(Ring Buffer)直接泵入模拟器;
  • 模拟器内的 AVCaptureVideoPreviewLayerAVCapturePhotoOutputUIImagePickerController 能够像真实设备一样接收实时相机画面!

2.4 设备农场(Device Farm)多开并行管理

访问 http://localhost:8421/farm,你可以以网格墙(Grid / Wall)的形式在一屏中同时监控并操控多台不同型号、不同 iOS 版本的模拟器。点击任意一台设备即可进入低延迟全功能控制页。

2.5 AI Agent 友好的 UI 树解析(Accessibility Tree)

运行 baguette describe-ui --udid <UDID>,它能通过私有 AccessibilityPlatformTranslation 框架,秒级导出当前界面的无障碍 JSON 树:

  • 输出每个 UI 元素的 rolelabelvalueidentifier 以及精确的点坐标(Frame)
  • 导出的坐标可以直接无缝管道输入到 baguette tap 执行点击;
  • 这意味着 AI Agent 可以闭环执行“截屏 -> 解析 UI 树 -> 思考判定 -> 派发物理手势”的全自动化 App 交互与回归测试!

3. 快速上手与 CLI 常用指南

3.1 一键安装(Homebrew)

# 需要在 Apple Silicon Mac 原生终端下执行
brew install baguette

3.2 启动 Web 控制台

# 启动本地 Web 服务器
baguette serve

# 浏览器访问单设备管理与流式面板
open http://localhost:8421/simulators

# 浏览器访问多设备农场
open http://localhost:8421/farm

3.3 终端无头自动化命令示例

# 1. 列出当前所有模拟器
baguette list

# 2. 无头冷启动指定设备
baguette boot --udid <UDID>

# 3. 点击指定坐标 (点坐标,支持任意屏幕缩放)
baguette tap --udid <UDID> --x 219 --y 478 --width 438 --height 954

# 4. 旋转设备方向
baguette orientation --udid <UDID> landscape-left

# 5. 生成 App Store 提交规范尺寸的截图与 10 秒高清视频
baguette screenshot --udid <UDID> --size appstore-6.9 -o hero.png
baguette record     --udid <UDID> --size appstore-6.9 --duration 10 -o demo.mp4

# 6. 导出当前界面的无障碍元素结构 (JSON)
baguette describe-ui --udid <UDID>

4. 架构设计与工程之美

Baguette 仓库有着极其严格的工程素养:

  • TDD 领域驱动设计:严格将 Domain、Infrastructure 与 App 分层;
  • 460+ Swift 自动化测试用例:对输入、屏幕流、无障碍、相机管道等全部外部端口设计了完整的 Mock 抽象,swift test 在不需要任何真实模拟器的情况下即可跑完全部自动化测试套件;
  • 现代化技术栈:采用 Swift 6.1+、Hummingbird 高性能异步 Web 框架与 Metal / VideoToolbox 硬件加速。

5. 总结

无论是用于日常摆脱臃肿的 Xcode 模拟器、搭建多设备 CI/CD 自动化流水线,还是配合 AI Agent(如 Claude Code / Cursor)打造自主探索与测试 App 的智能体,Baguette 都是目前 Apple 生态中极具创新力与实用价值的开源神器。

项目链接