☰
遇见Baguette:Headless控制iOS模拟器的神器,60fps串流+手势注入+多设备农场一站搞定
2026/10/7 15:06:34 网站建设 项目流程

遇见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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询