ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Baguette Wire协议完整参考:JSON手势信封从stdin管道到WebSocket

Baguette Wire协议完整参考:JSON手势信封从stdin管道到WebSocket Baguette Wire协议完整参考JSON手势信封从stdin管道到WebSocket【免费下载链接】baguetteHeadless control for Apples Simulators — 3D models, taps, swipes, multi-finger gestures, 60 fps streaming, and a multi-device farm项目地址: https://gitcode.com/gh_mirrors/baguette/baguetteBaguette是一个开源的 Apple 模拟器无头控制工具Headless control for Apples Simulators支持 3D 模型渲染、点按、滑动、多指手势、60 fps 屏幕流和多设备农场。而这一切的底层是一条统一的wire 协议——一份JSON 手势信封gesture envelope让 CLI 的 stdin 管道、HTTP 端点和浏览器 WebSocket 三种通道共用同一套手势消息。本文是这条 Baguette wire 协议的完整参考信封结构、确认ack机制、坐标单位、全部手势类型和流控制命令一次讲透。三种入口同一份信封 Baguette 的 wire 协议只有一条格式规则一行stdin或一条文本消息WebSocket 一个 JSON 对象永远以type字段开头。同一份手势信封可以从三个地方发进模拟器入口传输方式回复方式baguette input --udid UDIDstdin 上换行分隔的 JSONNDJSON每行输入在 stdout 回一行 ackPOST /simulators/UDID/input请求体就是一个信封响应体即 ackWS /simulators/UDID/stream每条文本消息一个信封手势无回复paste/copy/describe_ui有类型化*_result帧性能提示给每台设备保持一个常驻的baguette input进程而不是每个手势都起一个新进程——进程启动大约要 1 秒第一个手势还要承担 HID 预热开销。路由细节见 serve.md协议全文见 wire.md。确认与错误{ok:true}不等于屏幕上动了每个信封都会得到一个 ack 回复{ok:true} {ok:false,error:missing field: width}错误信息是可预期的枚举方便脚本判断JSON 解析失败 →invalid JSON缺字段 →missing field: name字段值非法 →invalid field: expected …未注册的type→unknown kind: type⚠️新手最常见的认知误区ok:true只表示消息被发送并接受了不代表屏幕上有任何东西做出了反应。比如 Xcode 27 的 Device Hub 就可能出现所有手势都回 ok 但全部落空的情况此时用baguette boot修复或运行baguette heal详见 device-hub 文档。坐标系设备点不是像素也没有归一化所有x/y/startX/endX/x1/cx等坐标字段都使用设备点device points与信封里同级的width/height同单位。四条铁律width/height从baguette describe-ui的外层screen.width/screen.height取。它是原生面板点framebuffer 未旋转轴且因设备而异——438×954 只属于 iPhone 17 Pro Max。应用根frame可能是局部的不能拿来当手势尺寸。wire 不做归一化。438×954 屏幕的中心是x:219, y:478发x:0.5, y:0.5点的是左上角附近。点是点不是像素在 3× 设备上用像素坐标会超调 3 倍。AX 树坐标与 HID 轴共享screen.orientation报告观察到的旋转不要对 AX 坐标做二次旋转。一个点按落错位置几乎总是这三种原因之一用了别台设备的width/height、把像素当点、在启动动画期间发了点按。定位手势tap、swipe、touch1-*、touch2-*、pinch、pan必须携带width和height其余手势不接受这两个字段。手势信封速查表10 种核心 type ️以下为 wire.md 中GestureRegistry.standard收录的全部手势时长单位均为秒1.tap— 单指点按{type:tap,x:219,y:478,width:438,height:954,duration:0.05}duration默认0.05。可选edgeleft/top/right/bottom构建与该边缘带触摸相同的效果未知值是报错而非落到屏幕内部。没有double-tap信封——双击要在同一条连接上发两对touch1-down/touch1-up见 double-tap。2.swipe— 滑动{type:swipe,startX:219,startY:760,endX:219,endY:190,width:438,height:954,duration:0.3}duration默认0.25是首尾总时长中间移动由服务端插值。3.touch1-down/touch1-move/touch1-up— 流式单指{type:touch1-down,x:219,y:950,width:438,height:954,edge:bottom}给 UI 循环驱动的拖拽用。每个down必须配一个upmove可选通常约 60 Hz。edge把它标记为系统手势bottom驱动 Home 指示条Home / App 切换器带实时预览top下拉出锁屏左或通知中心右普通触摸请省略它。4.touch2-*— 流式双指{type:touch2-move,x1:150,y1:478,x2:288,y2:478,width:438,height:954}实时捏合、旋转、双指平移的正确通道。5.pinch— 一次性捏合缩放{type:pinch,cx:219,cy:478,startSpread:60,endSpread:240,width:438,height:954,duration:0.6}cx/cy是中心点spread 是手指间距点变大 放大。服务端插值出 10 步双指移动。6.pan— 一次性双指平移{type:pan,x1:175,y1:478,x2:263,y2:478,dx:0,dy:200,width:438,height:954,duration:0.5}两指一起移动(dx, dy)点专为忽略单指平移的 App如地图设计。7.scroll— 滚轮{type:scroll,deltaX:0,deltaY:-50}负deltaY让内容向上滚动与 macOS 一致。8.button— 硬件按键{type:button,button:action,duration:1.0}可用值home、lock、power、volume-up、volume-down、action、app-switcher、swipe-to-app-switcher、swipe-to-home、pull-down-to-lock-screen、pull-down-to-notification-centerApple Watch 另有digital-crown、side-button。duration:0 短按大于 0 表示按住。9.key— 单键{type:key,code:KeyA,modifiers:[shift],duration:0.2}code采用 W3CKeyboardEvent.code体系修饰键取shift/control/option/command。10.type— 输入文本{type:type,text:hello world}仅支持可打印 US-ASCII遇到其他字符直接解析失败而不是半路截断需要输入 emoji 或非拉丁文字请用paste。手势注册与分发的源码实现位于 GestureRegistry.swift 与 Gesture.swift。流控制命令只有 WebSocket和baguette stream才认识以下 5 条命令只被流通道接受baguette input没有流所以不认识它们{type:set_bitrate,bps:4000000} {type:set_fps,fps:30} {type:set_scale,scale:2} {type:force_idr} {type:snapshot}set_scale是整数分母1 原始尺寸2 半分辨率force_idr请求立即发一个关键帧snapshot请求一个快照帧它们都不回复一个容易踩的坑baguette stream的 stdin 也接受同样的 5 条命令但键是cmd而不是type{cmd:set_fps,fps:30}这条通道的设计细节编码帧、二进制消息格式见 stream 特性文档。归属各特性的专用消息这些消息走同样的通道但属于某个特性报文与回复以对应特性文档为准消息通道归属文档paste/copy→paste_result/copy_resultstdin、流 WSpastedescribe_ui→describe_ui_result流 WSaccessibilityhinge服务端 → 页面仅折叠屏流 WShingelog_started/log/stoplogs WSlogscamera_list/camera_start/camera_stop…camera WScameracompanionhello/format/devices/…WSdevice-twin已知限制清单避坑指南siri不是按键所有已知的 Indigo 路径都会导致backboardd崩溃请求在进入模拟器前就被拒绝key/type只覆盖 US-ASCII没有输入法、死键和 emoji需要请用paste捏合必须是两指touch1-*虽然路由正确但UIPinchGestureRecognizer会把它当成 pan请用touch2-*或pinchXcode 27 Device Hub可能让所有手势回ok却落空baguette boot可修复否则跑baguette healCarPlay 平面baguette input --display carplay或流套接字加?displaycarplay可把手势打到 CarPlay 显示上见 companion-screens写在最后一条type开头的 JSON就能从终端脚本、HTTP 客户端或浏览器页面驱动模拟器完成点按、滑动、捏合到按键输入——这就是 Baguette wire 协议三个入口、一份信封的全部哲学。掌握width/height用设备点、ok:true不等于生效、流命令键名是cmd这三个要点就能避开新手期几乎所有的坑。完整字段定义请回到 docs/wire.md路由全表见 docs/serve.md命令参数一览见 docs/commands.md。【免费下载链接】baguetteHeadless control for Apples 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),仅供参考
返回列表