遇见Baguette:Headless控制iOS模拟器的神器,60fps串流+手势注入+多设备农场一站搞定
【免费下载链接】baguetteHeadless control for Apple's Simulators — 3D models, taps, swipes, multi-finger gestures, 60 fps streaming, and a multi-device farm项目地址: https://gitcode.com/gh_mirrors/baguette/baguette
Baguette 是一款开源的 iOS 模拟器 Headless 控制工具:一条 Swift 命令baguette加一个自包含的 Web UI,让你在完全不用打开 Xcode 或 Simulator.app 的情况下,启动模拟器、以 60 fps 串流屏幕、注入点击/滑动/多指手势、读取无障碍树、抓取截图与录屏,还能给模拟器喂摄像头、GPS 位置和弱网环境,并支持多设备农场并行驱动。
为什么需要 Baguette?
在 iOS 26 上,苹果悄悄改了SimulatorHID的通信格式,导致idb、AXe等老牌工具基于旧的 5 参数IndigoHIDMessageForMouseNSEvent调用全部失效——注入的触摸要么被静默丢弃,要么直接让backboardd崩溃。一时间,没有任何工具能在 Simulator.app 之外往 iOS 26 模拟器里注入触摸。
Baguette 正是为此而生。它使用了 Xcode 26 暴露的新 9 参数签名,把触摸正确路由到 digitizer 目标0x32,从宿主机直接注入输入,无需进程内代码、无需应用注入、无需DYLD_INSERT_LIBRARIES。完整的来龙去脉可以看 docs/ARCHITECTURE.md。
一分钟上手:安装与快速开始
📦 安装最简单的方式是 Homebrew(要求 Apple Silicon + Xcode 26,macOS 15+):
brew install baguette当然也可以从源码构建:
git clone https://gitcode.com/gh_mirrors/baguette/baguette cd baguette上手流程非常直接:
baguette serve # 启动 Web UI:http://127.0.0.1:8421/simulators baguette list # 列出所有模拟器 baguette boot --udid <UDID> # Headless 启动设备 baguette tap --udid <UDID> --x 219 --y 478 --width 438 --height 954 baguette describe-ui --udid <UDID> # 以设备点输出屏幕内容结构坐标统一使用设备点(points),baguette chrome layout --udid <UDID>可以查到屏幕尺寸。所有命令的完整参考在 docs/commands.md。
60 fps 屏幕串流:把模拟器画面搬进任何管道
baguette stream会把已启动模拟器的帧画面写到 stdout,支持MJPEG和H.264 (AVCC)两种编码,运行中还能通过 stdin 实时调参:
baguette stream --udid <UDID> --format avcc --fps 60 > frames.avcc baguette stream --udid <UDID> --format mjpeg --scale 2 | my-consumer- MJPEG 模式会跳过像素无变化的帧,节省带宽
- AVCC 模式发送完整帧序列,帧捕获快于编码时只保留最新一帧,保证低延迟
- 浏览器端则通过 WebSocket 拿到同一套编码器——
baguette serve启动后,网页里就是流畅的 60 fps 实时画面
细节见 docs/features/stream/README.md,配套的 docs/serve.md 列出了全部 Web 路由。
手势注入:从单指点击到系统边缘手势
Baguette 的输入能力覆盖 docs/features/touches/README.md 中的整套能力:
| 能力 | 示例命令 |
|---|---|
| 点击 / 双击 / 滑动 / 捏合 | tap、double-tap、swipe、pinch |
| 物理按键 | press --button swipe-to-home(Home、锁屏、音量、Watch 表冠) |
| 系统边缘手势 | 底部 7% 上滑触发 Home/应用切换器,顶部下拉通知中心 |
| 流式触摸 | 持续拖拽按真实轨迹逐帧注入 |
| 键盘与剪贴板 | key、type、paste、clipboard同步 |
长期会话推荐baguette input:从 stdin 读入换行分隔的 JSON 手势,逐条 ack,协议定义在 docs/wire.md。其底层实现值得源码爱好者一读:Sources/Baguette/Infrastructure/Input/IndigoHIDInput.swift 里详细注释了 iOS 26 触摸注入的"配方"。
多设备农场:一个浏览器标签页管理整个车队
baguette serve之后打开http://127.0.0.1:8421/farm,所有已启动的模拟器会并排呈现在一个多设备仪表盘里(功能文档:docs/features/device-farm/README.md):
- Grid / Wall / List 三种视图,按平台、状态、显示平面筛选
- 点击任意磁贴将其聚焦到右侧全画质预览窗,可直接点、滑、捏
- 顶部实时显示车队 FPS、带宽、延迟和时钟
- 支持批量启动/关机,一条 URL 即可分享给测试同事各自挑设备驱动
配合 docs/features/device-twin/README.md,甚至可以把一台真机 iPhone作为"数字孪生"接入同一套控制面板。
虚拟世界:摄像头、GPS、运动传感器与弱网
除了"操作设备",Baguette 还能"欺骗设备"的感知系统,让自动化测试覆盖更多场景:
| 维度 | 能力 | 文档 |
|---|---|---|
| 📷 摄像头 | 把 Mac 摄像头或本地视频文件喂给模拟器,App 里拍出来就是你的文件 | camera |
| 📍 定位 | 单点 GPS、沿路线步行导航 | location |
| 📳 运动 | 注入 CoreMotion 姿态、摇一摇(Shake) | motion |
| 🌐 网络 | 模拟慢网、弱网、离线条件 | network |
再加上screenshot(支持 App Store 规格尺寸的截图)、record(录制视频片段)、describe-ui(输出屏幕无障碍树 JSON)、logs(实时统一日志流)、openurl(深度链接)等命令,一个baguette就能替代大量零散脚本。
插件机制:把面板和命令装进 Bakery
Baguette 支持从受信任的 "bakery"(插件仓库)加载插件,以子进程方式运行并回调serve的 HTTP 接口,为 Web UI 追加自定义面板与命令,文档见 docs/features/plugins/README.md 和 examples/expo-bakery/README.md。Web 端还提供了 JS SDK,方便你把自己的页面接进来(docs/features/baguette-sdk/README.md)。
代码结构:三层架构,特性一目了然
Baguette 采用严格的三层划分(详见 docs/ARCHITECTURE.md):
Sources/Baguette/ ├── App/ # CLI 分发 + 用例编排 ├── Domain/ # 纯 Swift 值类型,不依赖私有 API ├── Infrastructure/ # @Mockable 协议 + 具体实现 └── Resources/Web/ # serve 提供的静态 HTML / JS / CSS跨层依赖严格向内流动,Tests/BaguetteTests/按同样的"限界上下文"镜像组织,测试规模与功能面基本 1:1。
它适合谁?
- 自动化测试工程师:不依赖 Xcode GUI 的可重复、可脚本化模拟器操作
- iOS 26 迁移用户:
idb/AXe失效后的直接替代方案 - 需要视觉验证的 CI:60 fps 串流 + 截图 + 录屏,画面即证据
- 设备农场搭建者:一个 URL 管一整队模拟器
一条brew install baguette,一条baguette serve,打开浏览器,你的 iOS 模拟器就开始真正"Headless"地工作起来——Bon appétit 🥐。
【免费下载链接】baguetteHeadless control for Apple's Simulators — 3D models, taps, swipes, multi-finger gestures, 60 fps streaming, and a multi-device farm项目地址: https://gitcode.com/gh_mirrors/baguette/baguette
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考