news 2026/10/8 4:20:05

Baguette serve 路由参考:以 HTTP/WS API 编程式驱动 iOS 模拟器的完整清单

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Baguette serve 路由参考:以 HTTP/WS API 编程式驱动 iOS 模拟器的完整清单

Baguette serve 路由参考:以 HTTP/WS API 编程式驱动 iOS 模拟器的完整清单

【免费下载链接】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是面向 Apple iOS 模拟器的 Headless 控制工具,而baguette serve内置了一个开箱即用的 HTTP + WebSocket 服务器:一条命令启动后,你就可以通过 30 多条 REST 路由和 6 条 WS 通道,编程式完成模拟器启动/关机、点击滑动等多指手势、60 fps 实时视频流、截图、3D 渲染、GPS/运动/网络注入等操作。本文是一份完整的 serve 路由参考清单,帮助你快速用脚本、CI 流水线或自己的网页驱动 iOS 模拟器。

快速启动模拟器控制服务器

默认监听http://127.0.0.1:8421,启动后浏览器打开根路径即可看到设备列表页:

baguette serve # http://127.0.0.1:8421/simulators

常用参数(完整说明见 docs/commands.md):

参数默认值说明
--port8421监听端口
--host127.0.0.1绑定的网卡 / 主机
--allowed-hosts无额外信任的 Host/Origin,可重复,*.example.com匹配子域
--plugin-dir无额外插件目录,同名时遮蔽已装插件
--no-plugins关忽略所有已安装插件

参数解析实现见 ServeCommand.swift。

路由设计三原则:UDID 在路径,格式看扩展名

📐 Baguette serve 的路由刻意做成了"一棵资源树",没有任何/api/前缀,规则非常直白:

  1. UDID 永远在路径里:/simulators/:udid/…,一台设备就是一个命名空间;
  2. 格式由文件扩展名决定:screenshot.jpg给 JPEG、screenshot.png给 PNG、simulators.json给 JSON;
  3. 薄处理器,无模板:服务器只把领域值投影成 JSON / PNG,UI 全部由 Resources/Web/ 下的静态 HTML/JS 承担。

设备生命周期路由:开机、关机、列设备

方法路径作用
GET/simulators设备列表页(含 Boot / Shutdown 按钮)
GET/simulators.json{running, available},与baguette list --json相同
POST/simulators/:udid/boot启动模拟器
POST/simulators/:udid/shutdown关机

一个典型的 CI 脚本序列就是GET /simulators.json找设备 →POST …/boot→ 测试 →POST …/shutdown。

手势输入路由:POST 一个 JSON 信封即可

POST /simulators/:udid/input是编程式驱动模拟器的核心路由:请求体放一个手势信封(JSON),响应体返回 ack。信封协议与baguette input共享,完整定义见 docs/wire.md。

支持的手势类型一览:

type用途关键点
tap单击必填width/height,edge可触发 Home Indicator 等系统手势
swipe滑动服务端插值,duration默认 0.25s
touch1-down/move/up单指流式触摸拖动、Home/App Switcher 拖拽、下拉通知中心
touch2-down/move/up双指流式触摸实时捏合、旋转、双指平移
pinch/pan一次性捏合 / 双指平移服务端自动插值 10 步
scroll滚轮滚动deltaY为负即内容上移
button实体按键home、lock、volume-up、action等
key/type按键 / 输入文本W3C 键码;仅 US-ASCII,其余请用paste

三个最容易踩的坑:

  • ✅ 坐标是设备点(points)不是像素,3× 屏用像素会偏 3 倍;
  • ✅width/height取自describe-ui的screen.width/height(每台设备不同,438×954 只是 iPhone 17 Pro Max);
  • ✅ 返回{"ok":true}只代表已发送,不代表屏幕有反应。

60 fps 流式路由:一个 WebSocket 扛下整个会话

WS /simulators/:udid/stream?format=mjpeg|avcc是全双工的"整场观看会话":

  • 服务器 → 页面:每条二进制消息一帧编码画面。MJPEG 直接发 JPEG 字节;AVCC(H.264)用 1 字节标签:0x01avcC 描述、0x02关键帧、0x03增量帧、0x04JPEG 种子帧;
  • 页面 → 服务器:文本 JSON,包括流控制set_bitrate/set_fps/set_scale/force_idr/snapshot与手势信封,二者共用同一通道。

没有旁路事件路由,也没有按 UDID 的注册表——socket 打开多久,流就持续多久;断开即停止采集。同族路由:

通道用途
WS …/stream.3d.mjpeg/.avcc3D 舞台实时流(可set_3d_camera旋转设备模型)
WS …/logs?level=&predicate=&bundleId=实时统一日志(unified log)
WS …/camera虚拟摄像头控制(camera_start/camera_stop等)

截图与 UI 结构路由:单帧画面 + 无障碍树

方法路径说明
GET/simulators/:udid/screenshot.jpg/.png单帧截图,支持quality、scale、size、fit、background查询参数
GET/simulators/:udid/screenshot-bezel.png画面嵌在设备边框里的合成图(buttons=控制按键)
GET/simulators/:udid/describe-ui.json?x=&y=无障碍树;带x+y时对该点做命中测试
GET/simulators/:udid/definition.jsonSDK 引导数据:身份、屏幕矩形、边框 URL、按键

系统环境注入路由:姿态、铰链、位置、网络

模拟真实世界条件,全部走简单 REST:

  • 🔄姿态:POST /simulators/:udid/orientation?value=portrait|landscape-left|…;POST …/shake触发运动摇一摇;
  • 📐铰链(iPhone Duo):GET/POST …/hinge,支持pose=、angle=、duration=折叠与回正;
  • 📍GPS:POST/DELETE …/location设置模拟位置,删除即清除;
  • 📶网络限速:GET/POST/DELETE …/network注入弱网条件;
  • 🚶CoreMotion:GET/POST/DELETE …/motion注入计步、姿态等运动数据;
  • 🕐状态栏:GET/POST/DELETE …/status-bar覆盖时间与电量显示;
  • 🎨系统界面:GET/POST …/interface.json调外观、对比度、文字大小。

文件、摄像头与 Deep Link 路由

方法路径作用
POST/simulators/:udid/files按扩展名上传文件到模拟器
POST/simulators/:udid/apps安装 App 归档
POST/simulators/:udid/media照片导入 Photos 图库
POST/simulators/:udid/camera-source?name=为摄像头准备一张图 / 一段视频
POST/simulators/:udid/openurl?url=打开 Deep Link
GET/simulators/:udid/schemes.json?q=查询设备已注册的 URL Scheme

插件与 Bakery 路由:把控制能力装进服务器

方法路径作用
GET/plugins.json已安装插件的 manifest 清单
POST/plugins/:id/commands/:cmd?udid=执行一条插件贡献的命令
GET/bakeries.json受信任的 bakery(插件仓库)与固定 commit
POST/bakeries/preview、/bakeries/install读取菜单 / 从受信来源安装

插件每次调用都会拿到一个一次性能力凭据(grant),凭据只带 manifest 声明的能力,命令结束即失效——这是它敢对网络暴露的原因。

物理设备孪生与伴生屏幕(预览)

  • GET /devices.json、WS /devices/:udid/…:物理设备 twin(video / motion 摄入、镜像流);
  • GET …/companion-screens.json:CarPlay 屏 + 配对手表;
  • POST …/carplay-display:挂载 CarPlay 平面(流式通道加display=carplay即可投到 CarPlay)。

安全须知:只信任回环 Origin

⚠️ 服务器只信任回环的Host/Origin,经反向代理的请求会得到403 forbidden origin。放行代理域名(子域可用通配):

baguette serve --allowed-hosts sim.example.com --allowed-hosts '*.example.com'

其他跨站 Origin 一律拒绝;插件则走各自的 grant 凭据,不受此限制。

完整路由速查表

类别路由文档
设备GET /simulators、/simulators.json、POST …/boot、…/shutdownboot
输入POST …/inputwire.md
画面GET …/screenshot.{jpg,png}、…/stream(WS)、…/stream.3d.*(WS)screenshot、3d-rendering
环境POST …/orientation、…/shake、…/location、…/motion、…/network、GET/POST …/hinge、…/status-bar各 feature README
内容POST …/files、…/apps、…/media、…/camera-source、…/openurlfile-upload
扩展/plugins.json、/plugins/:id/commands/:cmd、/bakeries.jsonplugins
静态页/farm(设备农场页)、/(302 →/simulators)、Resources/Web/静态资源device-farm

一行一格的原始表格见官方文档 docs/serve.md。

延伸阅读与源码索引

  • 路由权威清单:docs/serve.md
  • 手势 JSON 信封与坐标约定:docs/wire.md
  • 服务器参数:docs/commands.md
  • 服务器为什么是"薄处理器"设计:docs/ARCHITECTURE.md
  • 路由实现入口:Server.swift、ServeCommand.swift

小结:baguette serve把整个 iOS 模拟器变成了一组可预测的 HTTP/WS 资源——UDID 定设备、扩展名定格式、JSON 信封定手势。掌握上面这份清单,你就能在脚本、CI 或自定义面板里,像调用普通 API 一样驱动模拟器、录 60 fps 画面并注入真实的环境条件。

【免费下载链接】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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/8 4:19:57

Deep Attention SMOTE:工业时序异常检测的数据增强新思路

1. 工业时序异常检测的痛点与Deep Attention SMOTE的破局思路1.1 工业场景下异常检测为什么这么难干过工业设备监测或者产线质检的朋友应该都有体会,异常检测这件事,理论上方法一大堆,真落到车间里跑起来,能稳定用的没几个。核心矛…

作者头像 李华
网站建设 2026/10/8 4:19:07

AI游戏从技术炫技到产品验证:200万销量与2000万玩家背后的设计逻辑

1. 从200万销量到2000万玩家:这个数字背后藏着什么第一次看到“200万销量、2000万玩家”这组数据的时候,我正坐在电脑前翻一份行业报告。说实话,做游戏分析和产品拆解这么多年,单个数字早就很难让我兴奋了。但这两个数字放在一起&…

作者头像 李华
网站建设 2026/10/8 4:18:24

智能体工作空间隔离实战:LocalCortex Harness机制与多实例治理

1. 从一次翻车现场说起:为什么工作空间选错,智能体全盘皆输去年年底我接手了一个内部知识库问答智能体的项目,需求不复杂:把公司散落在各个文档系统里的技术资料整合起来,做一个能回答研发同事日常问题的助手。模型选型…

作者头像 李华
网站建设 2026/10/8 4:18:02

AI Agent运维平台如何实现30秒自愈:架构、决策与落地实践

1. 从"30秒自愈"说起:智能运维到底在解决什么痛点运维这个行当,干过的人都知道,最怕的不是系统崩,而是崩了之后找不到原因。凌晨三点被告警电话叫醒,打开监控面板一片红,日志刷得比弹幕还快&…

作者头像 李华
网站建设 2026/10/8 4:17:56

Claude、Codex、Grok 命令行 AI 工具组合实战:工作流设计与效率提升指南

1. 三款命令行 AI 工具的组合逻辑与选型思路1.1 为什么是这三个,而不是别的组合把 Claude、Codex、Grok 三家的命令行工具放在一起用,这个思路其实不是拍脑袋想出来的。我在实际项目里反复试过各种搭配,最后沉淀下来的结论是:这三…

作者头像 李华
网站建设 2026/10/8 4:17:53

Unity3D塔防游戏虚拟现实大作业:从零到exe完整实现指南

简介:面向Unity3D初学者及虚拟现实课程作业需求,这份塔防游戏项目提供了从源代码、可执行程序到设计报告的完整学习闭环。压缩包约37.3MB,虽未显示文件总数,但主要文件包括Unity工程源程序、可直接运行的EXE以及游戏设计报告&…

作者头像 李华