Repository navigation
Releases: Souitou-iop/LoopCtrl
Release list
LoopCtrl v0.3.4
LoopCtrl 0.3.4:把"一来一回"的操控改成批量——设备端 run_steps、动作附带观察、多条件等待;控制页实时显示操作者的触控轨迹 / This release turns step-by-step control into batches: device-side run_steps, observe attachments on actions, multi-condition waits — plus live touch trails on the control page.
⚡ 批量与速度 / Batching and speed
run_steps(设备端批量):一次调用在手机上连续执行最多 20 步({method, params, expect?}),首错即停,not_sent列出没跑的步骤,定屏画面随回复带回。客户端run检测到该能力后整包下发,省掉每步一次的网络往返(中继/蜂窝下每步省 0.3–0.5s)/run_steps(device-side batch): one call runs up to 20 steps on the phone; the first error or failedexpectstops the batch,not_sentlists what never ran, and the settled screen rides home. The Python client'srunhands the whole batch over when the device advertises it.- 动作附带观察(
observe):tap/swipe/type等动作可在回复里直接附带定屏画面——"visible"完整树,"compact"去坐标约 1/4 体积——省掉下一次page_source/observeattachments: actions can carry the settled screen in their reply — full tree, or frames-stripped compact (~1/4 the size) — saving the following page_source call. wait_for多条件等待:{present:[…], absent:[…], foreground}在设备上一次轮询完成,替代"读屏→思考→再读屏"循环;只查前台时跳过读树 /wait_for: several present/absent/foreground conditions polled in one call; foreground-only waits skip the tree read.quiet_window:按页面显式覆盖 settle 静默窗口(0.2–3s) /quiet_window: explicit per-action settle override.- 计时指标:每个方法的 p50/p90 与排队耗时进入
config与/logs/ Timing: per-method p50/p90 and queue wait inconfigand/logs. - 说明书/协议版本升至 1.98.14,新增能力标签
run_steps、wait_for、action_observe、quiet_window/ skill and server version 1.98.14 with new capability tags.
🖥 控制页与推流 / Control page and stream
- 触控轨迹可视化:操作者的点按、长按、拖动在观众控制页上实时画出轨迹(标注发送者)/ Touch trails: the operator's taps, long-presses and drags draw live on viewers' control pages, labeled per sender.
- 推流端口轮换:系统录屏推流轮换使用 48300–48307,并新增
welcome握手(见 docs/remote-control.md)/ Broadcast port rotation: system-broadcast streaming rotates 48300–48307 with awelcomehandshake.
🧪 其他 / Also
- idevice 框架新增 iOS 模拟器切片,runner 可编进模拟器;音量键在模拟器返回明确错误;模拟器通知授权 5 秒超时不再卡启动 / idevice gains an iOS-simulator slice (the runner now builds for the Simulator); volume buttons report a clear error there; notification authorization times out after 5s instead of hanging simulator startup.
Bundle version 0.3.4 (build 8).
Install
Download LoopCtrl.ipa. It is one app and takes one sideloading slot. It
replaces an older LoopCtrl install. Check it against SHA256SUMS.txt if you
like.
- Re-sign and install it: the latest SideStore (My Apps → +) with a free
Apple ID, or on a MacScripts/sign-ipa.sh -i LoopCtrl.ipa.
Signers that skip the nested.xctestproduce an app that crashes on open. - Trust the certificate under Settings → General → VPN & Device Management,
and turn on Developer Mode. - Below iOS 27, pair once over USB with
LoopCtrl Pair (Windows,
macOS, Linux, Android) or import a pairing file. On iOS 27 and later, pair
on the phone. - Open LoopCtrl → mount the Developer Disk Image (with LocalDevVPN or
Shadowrocket connected) → Start. The first start asks for your passcode
and for Notifications and Local Network access.
The package is unsigned, so iOS will not install it as-is. It carries no
provisioning profile, no team id and no device identifiers.
See the README for
requirements by iOS version, pairing approval, LAN and remote access, and the
API.
LoopCtrl v0.3.3
LoopCtrl 0.3.3:补齐四个设备功能——实体音量键、剪贴板、保持唤醒、系统截图;控制页的工具条改成可自由排序。中继继续用 server-v0.3.0,Pair 不变。/ Four device features — real volume keys, clipboard, keep-awake and system screenshots — plus a freely sortable tools rail on the control page. The relay stays at server-v0.3.0; Pair is unchanged.
✨ 新增 / New
- 音量键:控制页工具条上的音量 + / −,按的是手机的真实媒体音量键(
XCUIDevice.press),返回只代表按键已发出 / Volume keys: the volume + / − buttons press the phone's real media buttons (XCUIDevice.press); the reply says the press went out, not what the level became - 剪贴板:把电脑上的文字发到手机剪贴板,或读取手机复制的文字。iOS 只允许 App 在前台时读写剪贴板,所以读取/写入时 LoopCtrl 会短暂切到前台,做完再切回原来的 App;文字不会写进日志 / Clipboard: send text to the phone's clipboard or read what it copied. iOS only allows this while the app is in the foreground, so LoopCtrl comes forward briefly and goes back afterwards; the text is never logged
- 保持唤醒:每 10 秒按一次 iOS 不认识的 F13,最长 60 分钟,锁屏时自动跳过;适合长时间无人值守 / Keep awake: F13 (a key iOS ignores) every 10 s for up to 60 minutes, skipped while locked, for long unattended runs
- 系统截图:触发和实体键一样的系统截图,iOS 存进相册。返回只代表事件已发出,需要自己去 Photos 确认 / System screenshot: sends the same key as the hardware shortcut; iOS saves it to Photos. The reply means the event went out — check Photos to confirm
🔧 改进 / Improvements
- 工具条可自由排序:所有功能是一个有序列表,前 5 个常驻工具条,其余进「更多」;「更多 › 排序按钮」里用 ↑ ↓ 调整,分隔线以下自动进「更多」,顺序存在当前浏览器;宽且高的窗口直接展开全部 / Freely sortable tools rail: one ordered list, the first five stay on the bar and the rest go into More; More › Sort buttons moves them with ↑ ↓, the divider marks where More starts, and the order is kept per browser; a wide, tall window shows the whole list
- 剪贴板和系统截图从设置移到工具条(在「更多」里),设置里只留「保持唤醒」 / Clipboard and System screenshot moved from Screen settings into the tools area (More); Screen settings keeps Keep awake
Bundle version 0.3.3 (build 6).
Install
Download LoopCtrl.ipa. It is one app and takes one sideloading slot. It
replaces an older LoopCtrl install. Check it against SHA256SUMS.txt if you
like.
- Re-sign and install it: the latest SideStore (My Apps → +) with a free
Apple ID, or on a MacScripts/sign-ipa.sh -i LoopCtrl.ipa.
Signers that skip the nested.xctestproduce an app that crashes on open. - Trust the certificate under Settings → General → VPN & Device Management,
and turn on Developer Mode. - Below iOS 27, pair once over USB with
LoopCtrl Pair (Windows,
macOS, Linux, Android) or import a pairing file. On iOS 27 and later, pair
on the phone. - Open LoopCtrl → mount the Developer Disk Image (with LocalDevVPN or
Shadowrocket connected) → Start. The first start asks for your passcode
and for Notifications and Local Network access.
The package is unsigned, so iOS will not install it as-is. It carries no
provisioning profile, no team id and no device identifiers.
See the README for
requirements by iOS version, pairing approval, LAN and remote access, and the
API.
LoopCtrl v0.3.2
LoopCtrl 0.3.2:修好系统录屏推流——它现在真正接管画面,开启后点击也不再偏移;控制页在窄屏上完整显示状态行。中继继续用 server-v0.3.0,Pair 不变。/ Fixes System Broadcast — it now actually takes over the picture, and taps are no longer offset while it runs — and gives the control page's status line its own row on narrow screens. The relay stays at server-v0.3.0; Pair is unchanged.
🐞 修复 / Fixes
- 系统录屏推流真正生效:扩展连上以后,runner 在收到 hello 之前没有持有这个连接,对象被释放,握手永远完不成——日志里只有 connected,没有 started,画面一直还是截图。现在连接会被持有到握手完成(被新连接替换或提前关闭时也会清理)/ System Broadcast actually takes over: after accepting the extension's connection the runner did not retain it until its hello arrived, so the handshake never completed — the log said "connected" but never "started", and the picture stayed on screenshots. The connection is now held until hello, and cleaned up when replaced or closed early
- 开启录屏后点击不再偏移:扩展把 ReplayKit 已经缩放的视频缓冲(884×1920)当成屏幕像素除以 3,上报的点击空间是 294×640,而真实屏幕是 402×874;于是点右下角会落在左上。现在点击空间取
UIScreen.nativeBounds / nativeScale,只在画面旋转时交换宽高 / No more offset taps with broadcast on: the extension treated ReplayKit's already-scaled buffer (884×1920) as screen pixels, so it reported a 294×640 tap space instead of the real 402×874, and taps landed up and to the left. The tap space now comes fromnativeBounds / nativeScale, swapping axes only when the picture is turned - 窄屏顶栏不再裁掉状态行:宽度 ≤760px 时状态行独立成第二行;≤375px 时与人数胶囊同排;≤340px 隐藏人数胶囊;横屏仍保持单行 / The status line is no longer clipped on narrow screens: at ≤760px it gets its own row under the bar; at ≤375px it shares that row with the people pill; at ≤340px the pill is hidden; landscape stays one row
📥 下载地址 / Downloads
- iOS 应用 App(未签名 IPA,需自行重签后侧载):LoopCtrl.ipa — 可直接覆盖旧版 LoopCtrl
- 全部文件的 SHA256 / Checksums:SHA256SUMS.txt
Bundle version 0.3.2 (build 5).
Install
Download LoopCtrl.ipa. It is one app and takes one sideloading slot. It
replaces an older LoopCtrl install. Check it against SHA256SUMS.txt if you
like.
- Re-sign and install it: the latest SideStore (My Apps → +) with a free
Apple ID, or on a MacScripts/sign-ipa.sh -i LoopCtrl.ipa.
Signers that skip the nested.xctestproduce an app that crashes on open. - Trust the certificate under Settings → General → VPN & Device Management,
and turn on Developer Mode. - Below iOS 27, pair once over USB with
LoopCtrl Pair (Windows,
macOS, Linux, Android) or import a pairing file. On iOS 27 and later, pair
on the phone. - Open LoopCtrl → mount the Developer Disk Image (with LocalDevVPN or
Shadowrocket connected) → Start. The first start asks for your passcode
and for Notifications and Local Network access.
The package is unsigned, so iOS will not install it as-is. It carries no
provisioning profile, no team id and no device identifiers.
See the README for
requirements by iOS version, pairing approval, LAN and remote access, and the
API.
LoopCtrl v0.3.1
LoopCtrl 0.3.1:远程画面的稳定性和流畅度。修掉「能操作但画面不动、刷新才恢复」,每个观看端有了自己的编码器,中继断线后会自己连回,并新增可选的「系统录屏推流」。中继继续用 server-v0.3.0 即可。/ Steadier, smoother remote screen. Fixes "actions work but the picture is frozen until a reload", gives every viewer an encoder of its own, reconnects to the relay by itself after a drop, and adds an optional System Broadcast. The relay stays at server-v0.3.0.
🐞 修复 / Fixes
- 画面停住、操作照常、刷新才好:LoopCtrl 在前台时建的硬件编码器,一回到后台(比如在网页上按了主屏幕)就被 iOS 作废,之后帧进去什么都不出,也不报错。现在 LoopCtrl 进出前后台时编码器都会重建,编码报错或一秒没有输出也会马上换一个新的;控制页自己也会检查:帧来了画不出来就换播放器,操作后没有新画面就要关键帧,再没有就重连 / Frozen picture while actions still work, until a reload: iOS invalidates a hardware encoder made while LoopCtrl was in front once LoopCtrl goes to the background (pressing Home from the page is enough), and frames then went in with nothing coming out and no error. Encoders now restart whenever LoopCtrl moves between foreground and background, and any encoder that errs or returns nothing for a second is replaced at once. The control page also checks the picture itself: frames that arrive but aren't shown get a new player, and an action with no new frame asks for a keyframe, then reconnects
- 中继断线后不再一直离线:以前重连 5 次失败就关掉自动连接,要手动再连。现在一直在后台重试(每 30 秒,网络变化时立即),Wi-Fi 和蜂窝切换时马上换新隧道 / No longer stuck offline after a relay drop: five failed reconnects used to turn auto-connect off until someone reconnected by hand. The phone now keeps retrying (every 30 s, at once when the network changes), and opens a new tunnel as soon as it moves between Wi-Fi and cellular
- 切换标签页不再断流重连:页面隐藏 15 秒内回来,继续用原来的流 / Switching tabs no longer restarts the stream: a page back within 15 s keeps its stream
🔧 改进 / Improvements
- 每个观看端一个编码器(最多 3 个,再多的按相同画质共用):新观看端加入不再改掉别人的画质和编码格式,中继上慢的观看端也不再拖慢局域网上的 / An encoder per viewer (up to three; more share one of the same quality): a viewer joining no longer changes everyone else's quality and codec, and a slow viewer on the relay no longer slows one on the LAN
- 静止画面少截图:画面 1 秒没变就降到每秒 10 次检查,一变或一操作立刻恢复全速,手机更凉 / Fewer screenshots of a still screen: after a second without change it is checked 10 times a second, back to full rate the moment it changes or an action lands, so the phone stays cooler
- 通过中继打开的控制页可以走局域网直连(Chrome / Edge,首次会询问「本地网络访问」):手机和浏览器在同一局域网时,控制和画面直接走局域网,失败自动回到中继 / A control page opened through the relay can go direct on the LAN (Chrome / Edge, which ask once for local network access): when the phone and the browser share a LAN, control and video go there, falling back to the relay on any failure
- 系统录屏推流(可选,设置 › 系统录屏推流):画面改由 iOS 系统录屏提供,不再逐帧截图;每次在首页点「开始」,运行时有红色录屏标记,结束后自动回到截图。控制页状态栏显示当前是「截图」还是「系统录屏」 / System Broadcast (optional, Settings › System Broadcast): the screen comes from iOS screen recording instead of screenshots; start it on the home screen each time, it shows the red recording indicator, and screenshots take over again when it ends. The control page's status line says which one is in use
📥 下载地址 / Downloads
- iOS 应用 App(未签名 IPA,需自行重签后侧载):LoopCtrl.ipa — 可直接覆盖旧版 LoopCtrl;新增一个录屏扩展(
<bundle id>.broadcast),用免费账号侧载时会多占一个 App ID / installs over the older LoopCtrl; it now carries a screen-broadcast extension (<bundle id>.broadcast), which takes one more App ID on a free signing account - 全部文件的 SHA256 / Checksums:SHA256SUMS.txt
Bundle version 0.3.1 (build 4).
Install
Download LoopCtrl.ipa. It is one app and takes one sideloading slot. It
replaces an older LoopCtrl install. Check it against SHA256SUMS.txt if you
like.
- Re-sign and install it: the latest SideStore (My Apps → +) with a free
Apple ID, or on a MacScripts/sign-ipa.sh -i LoopCtrl.ipa.
Signers that skip the nested.xctestproduce an app that crashes on open. - Trust the certificate under Settings → General → VPN & Device Management,
and turn on Developer Mode. - Below iOS 27, pair once over USB with
LoopCtrl Pair (Windows,
macOS, Linux, Android) or import a pairing file. On iOS 27 and later, pair
on the phone. - Open LoopCtrl → mount the Developer Disk Image (with LocalDevVPN or
Shadowrocket connected) → Start. The first start asks for your passcode
and for Notifications and Local Network access.
The package is unsigned, so iOS will not install it as-is. It carries no
provisioning profile, no team id and no device identifiers.
See the README for
requirements by iOS version, pairing approval, LAN and remote access, and the
API.
LoopCtrl v0.3.0
LoopCtrl 0.3.0:合并仓库后的首个正式 tag,版本号与中继(server-v0.3.0)、Pair(pair-v0.3.0)统一。主打新功能:通过中继或局域网直接从浏览器远程控制 iPhone。/ The first tagged release of the merged repository, with version numbers unified to 0.3.0 across the app, the relay (server-v0.3.0) and Pair (pair-v0.3.0). Headline: control the iPhone from a browser, through the relay or directly on the LAN.
🔧 改进 / Improvements
- 浏览器远程控制:手机保持一条到中继的 WebSocket 隧道,浏览器打开手机的公共地址(
…/d/<slug>/)即可控制,与局域网直连同一套/remote控制页和/rpc接口(见 remote-control.md)/ Browser remote control: the phone holds one WebSocket tunnel to the relay; opening the phone's public address (…/d/<slug>/) in a browser gives the same/remotecontrol page and/rpcAPI as the LAN - 版本统一:app、中继、Pair 三端从本版本起使用同一版本号迭代 / Unified versioning: the app, the relay and Pair share one version number from this release on
- 中继配套:本版本需要支持
loopctrl-tunnel-v1的中继(server-v0.3.0起)才可远程;旧中继只影响远程功能,USB 直连不受影响 / Relay requirement: remote control needs a tunnel-capable relay (server-v0.3.0or later); USB pairing and LAN control are unaffected - 控制页功能区去掉「锁屏」和「唤醒」:锁屏对浏览器这一侧没有可见收益;
unlock只能按 Home 键,设有密码时进不去,而它把「真的解锁」当作成功条件,于是白等几秒报超时。RPC 的lock/unlock/is_locked不变,无密码的无人值守测试机照旧可调用 / The control page's tool rail no longer carries Lock and Wake: locking gains the browser operator nothing, andunlockonly presses Home — with a passcode set it can never meet its own success test, so it waited out and timed out. Thelock/unlock/is_lockedRPCs are unchanged, as before for unattended test devices without a passcode - 中继连接详情页两行同栅格:控制地址落在标题那一列,复制 / 分享落在值那一列的右边缘 / The relay connection detail rows share one grid: the control address sits in the title's column, copy and share on the value's trailing edge
- 局域网也有了「网页控制」入口:设置首页的连接卡片新增一行,给出
http://<局域网地址>:8300/remote,可复制、可分享;地址取服务自己报告的那份(隧道和蜂窝的占位地址已被排除),没有局域网就不出现这一行。齿轮页里重复显示的本机 / 局域网两条一并删掉,一个地址从此只出现在一处 / The LAN gets a Control page entry: the home screen's connection card now carrieshttp://<lan address>:8300/remote, to copy or share. The address comes from what the service itself advertises (tunnel and cellular placeholders excluded), and the row is absent when there is no LAN. The gear page's duplicate This device / Wi-Fi rows are gone — an address now appears in exactly one place
📥 下载地址 / Downloads
- iOS 应用 App(未签名 IPA,需自行重签后侧载):LoopCtrl.ipa — 一个应用占一个侧载位,可直接覆盖旧版 LoopCtrl
- 全部文件的 SHA256 / Checksums:SHA256SUMS.txt
Bundle version 0.3.0 (build 3).
Install
Download LoopCtrl.ipa. It is one app and takes one sideloading slot. It
replaces an older LoopCtrl install. Check it against SHA256SUMS.txt if you
like.
- Re-sign and install it: the latest SideStore (My Apps → +) with a free
Apple ID, or on a MacScripts/sign-ipa.sh -i LoopCtrl.ipa.
Signers that skip the nested.xctestproduce an app that crashes on open. - Trust the certificate under Settings → General → VPN & Device Management,
and turn on Developer Mode. - Below iOS 27, pair once over USB with
LoopCtrl Pair (Windows,
macOS, Linux, Android) or import a pairing file. On iOS 27 and later, pair
on the phone. - Open LoopCtrl → mount the Developer Disk Image (with LocalDevVPN or
Shadowrocket connected) → Start. The first start asks for your passcode
and for Notifications and Local Network access.
The package is unsigned, so iOS will not install it as-is. It carries no
provisioning profile, no team id and no device identifiers.
See the README for
requirements by iOS version, pairing approval, LAN and remote access, and the
API.
LoopCtrl relay server-v0.3.0
LoopCtrl relay server-v0.3.0:代码与 server-v0.2.0 相同(中继本身无改动),本版本起版本号与 LoopCtrl 主程序、Pair 统一为 0.3.0。它是手机与浏览器之间的隧道中继,把手机的 /remote 控制页和 /rpc 接口暴露成公共地址。/ The relay code is identical to server-v0.2.0 (no relay changes in this wave); the version number now moves together with the LoopCtrl app and Pair as 0.3.0. It is the tunnel relay between the phone and a browser, exposing the phone's /remote control page and /rpc API at a public address.
🔧 说明 / Notes
- 本版本无功能改动,镜像在 linux/amd64 与 linux/arm64 上重新构建并打上统一版本号 / No functional changes; the image is rebuilt for linux/amd64 and linux/arm64 under the unified version
- 与 app(
v0.3.0)配套:远程控制需要支持loopctrl-tunnel-v1隧道的中继版本 / Pairs with appv0.3.0: browser remote control needs a tunnel-capable relay (loopctrl-tunnel-v1) - 自托管文档 / Self-hosting: self-host-relay.md
📥 获取方式 / How to get it
Docker(推荐 Recommended)
docker pull ghcr.io/souitou-iop/loopctrl-relay:0.3.0镜像包页面 / Package page:ghcr.io/souitou-iop/loopctrl-relay
- 标签 Tags:
0.3.0(精确版本)|0.3(跟随小版本)|latest - 架构 Architectures:linux/amd64、linux/arm64
校验 / Verify
镜像在 工作流运行 40543751315 中构建;构建提交 3167e99,与 tag server-v0.3.0 一致。
❓ 常见问题 / FAQ
- 升级不影响已注册手机:注册状态存在
state.json,换镜像不丢 / Upgrading keeps enrolled phones: enrollment lives instate.json, not the image - 生产实例由 LoopCtrl-Platform 的
deploy.sh管理;自托管参考 self-host-relay.md / The production instance is managed by LoopCtrl-Platform'sdeploy.sh
LoopCtrl Pair v0.3.0
LoopCtrl Pair 0.3.0:功能与 0.2.1 相同,本版本起版本号与 LoopCtrl 主程序、中继统一为 0.3.0,安卓正式包首次由 GitHub Actions 用发布密钥签名发布。/ LoopCtrl Pair 0.3.0 is functionally the same as 0.2.1; from this release the version numbers of the app, the relay and Pair move together, and the Android release APK is signed by GitHub Actions with the release key for the first time.
🔧 改进 / Improvements
- 版本号与 LoopCtrl 主程序(
v0.3.0)、中继(server-v0.3.0)统一为 0.3.0,之后三者一起迭代 / The version number moves in lockstep with the LoopCtrl app (v0.3.0) and the relay (server-v0.3.0); the three iterate together from now on - 安卓正式版安装包改由 GitHub Actions 用发布密钥签名(与 0.2.1 同一把密钥,可直接覆盖升级)/ The Android release APK is now signed by GitHub Actions with the release keystore (the same key as 0.2.1, so it installs over it)
- 桌面版与安卓版的构建、签名全部来自合并后的 LoopCtrl 仓库流水线 / Desktop and Android bundles are all built and signed by the merged LoopCtrl repository's pipeline
- 功能代码与 0.2.1 相同:0.2.1 在 Android、Windows、macOS 上用真 iPhone 走通配对流程的结论适用 / No functional code changes since 0.2.1: the real-iPhone pairing runs verified there (Android, Windows, macOS) still apply
📥 下载地址 / Downloads
Android(USB OTG 配对 iPhone)
- 正式版 Release(推荐 Recommended):LoopCtrl-Pair-0.3.0-android.apk — 发布密钥签名,Android 8+,需要 USB OTG 线
- 测试版 Debug:LoopCtrl-Pair-0.3.0-android-debug.apk — 额外带「开发者选项」里的模拟设备,不用真机也能试
macOS 12+(Apple Silicon 和 Intel)
- 桌面版 Desktop:LoopCtrl-Pair-0.3.0-macos-universal.dmg — 未签名未公证,首次打开请右键 › 打开
- 命令行 CLI:loopctrl-pair-cli-0.3.0-macos-universal.tar.gz
Windows 10/11(需要 Apple Devices 应用)
- 安装版 Installer:LoopCtrl-Pair-0.3.0-windows-x64-setup.exe — 未签名,SmartScreen 提示时选「仍要运行」
- 命令行 CLI:loopctrl-pair-cli-0.3.0-windows-x64.zip
Linux
校验 / Checksums
- 全部文件的 SHA256:SHA256SUMS.txt
❓ 常见问题 / FAQ
- 安装安卓正式版前如果装过更早的 debug 包(0.1.x、0.2.0),签名不同需要先卸载;0.2.1 及以后可直接覆盖 / If an APK from 0.1.x or 0.2.0 is installed, uninstall it first (different signature); 0.2.1 and later install over each other
- 安卓版通过 USB OTG 线连接 iPhone,首次连接要在手机上点「信任」/ The Android app reaches the iPhone over a USB OTG cable; tap Trust on the iPhone the first time
- Linux 桌面版与命令行、iOS 16 和 17.0–17.3 的旧配对路径尚未接过真 iPhone,其余未验证项见 0.2.1 说明 / The Linux desktop and CLI builds, and the legacy pairing paths for iOS 16 and 17.0–17.3, have not seen a real iPhone yet; other unverified items are listed in the 0.2.1 notes