记录日期:2026 年 10 月 1 日。本文记录当前工作目录中的操作、错误日志与验证结果。最终结果:用户已在 iOS 26.5 真机上使用 sudo 验证,USB 隧道可以建立,项目可以模拟定位。

环境与目标

项目本次环境
电脑macOS 15.6.1(24G90),Apple Silicon/arm64
手机iOS 26.5,开发者模式已开启,USB 已连接并受信任
Python 管理uv 0.12.8;uv 管理的 CPython 3.12.13;项目内 .venv
当前设备库pymobiledevice3==9.27.0
项目iOSRealRun-cli-17,起点为 083f8ec6ddfe558edb48f054222f109673a2f0e6

本次部署沿用 macOS 15.6.1,目标是让项目连接 iOS 26.5。仓库 README 要求 macOS 以 root 权限运行,以便创建 TUN 网络接口;运行结束时使用 Ctrl+C 清除模拟定位。[1]

从空目录搭环境

工作从空目录开始。仓库克隆至 ~/Develop/iosrealrun 后,用 uv 创建 Python 3.12 虚拟环境并安装依赖:[2]

cd ~/Develop/iosrealrun
uv venv --python 3.12
uv pip install --python .venv/bin/python -r requirements.txt

原项目固定 pymobiledevice3==2.46.1、PyYAML==6.0.1 和 geopy==2.4.1。首次安装时,解析器选到的新版 qh3 缺少旧设备库调用的 packet_builder,项目导入失败。将 qh3 暂时固定为 0.15.1 后,导入检查通过;随后才进入真机隧道测试。原仓库也有相同的版本约束建议。[3]

路线配置使用用户提供的 32 个坐标,保存于 route.txt。config.yaml 设置 routeConfig: "route.txt" 与 v: 3.3333333333,基准配速约 5:00/公里;程序每圈随机浮动约 ±15 秒/公里。解析后的单圈约 446.3 米,其中终点直线回到起点约 73.1 米,用户已确认这段连接。libimobiledeviceDir 与 imageDir 在当前 Python 代码中没有调用点,因此保持仓库默认值。

故障一:QUIC 握手失败

第一次真机运行读出 Your system version is 26.5,随后旧版库在 QUIC 握手中抛出 ConnectionError。调用栈与原仓库 issue #91 一致,错误落在 qh3.asyncio.protocol.wait_connected()。[4] 手机识别和版本读取已完成,故障点位于隧道握手。

原实现的隧道子进程退出后,主进程仍在 queue.get() 等待。参考 PR #92 加入 QUIC→TCP 回退、子进程错误回传及 60 秒超时。[5]

故障二:TCP 的 PSK/TLS 密码套件不可用

第二次运行给出了明确的 TCP 错误:

TCP 隧道失败: SSLError(1, '[SSL: NO_CIPHERS_AVAILABLE] no ciphers available')

TCP 路线已执行,PSK/TLS 握手报告可用密码套件为空。错误发生在设备隧道阶段;USB 识别和系统版本读取已成功。当前 uv Python 3.12.13 使用 OpenSSL 3.5.7。pymobiledevice3 9.27.0 对 Python 3.13 使用标准库 PSK 回调,对更低版本使用 sslpsk_pmd3 回退路径。[6] 本机升级设备库后依然复现该 SSL 错误,排障方向转向隧道入口。

改用 USB CoreDeviceProxy

PR #96 提供了 pymobiledevice3 9.x 的异步 API 适配,并报告在 macOS、iOS 26.5.1 上成功运行。[7] 本地移植了设备初始化、DVT 定位和路线循环的异步改动,将依赖固定为 pymobiledevice3==9.27.0。该 PR 使用远程配对服务建立 TCP 隧道;本机复测仍出现上述 PSK/TLS 错误。

隧道入口进一步改为 CoreDeviceTunnelProxy.create(lockdown),通过 USB lockdown 服务建立 TCP 隧道。原仓库的另一项修复也采用了这个入口。[8] pymobiledevice3 9.27.0 源码显示,USB 入口复用设备服务连接;远程配对 TCP 入口则会创建 SSLPSKContext。[6] 本地服务发现检查确认,这台 iOS 26.5 手机提供 CoreDeviceProxy 服务。随后用户以 sudo 运行项目,确认 USB 隧道和模拟定位均可工作。

本地主要文件改动如下:

文件改动及原因
.python-version、.gitignore、requirements.txt记录 Python 3.12、忽略 .venv,固定新版设备库
route.txt、config.yaml保存用户路线,设置约 5:00/公里的基准速度
driver/connect.py改用新版异步 lockdown API 和 USB CoreDeviceTunnelProxy
driver/location.py、run.py、init/init.py、main.py适配新版异步定位与连接接口;将忙等待改为异步休眠
init/tunnel.py回传子进程错误并加入 60 秒超时,在失败时终止等待
README.md加入 uv 安装与虚拟环境运行命令

验证结果与运行方式

本地检查通过:uv pip check(当前 98 个包兼容)、Python 代码导入与编译检查、32 点路线解析、USB 读取 iOS 26.5/开发者模式、CoreDeviceProxy 服务发现,以及隧道调用流程的模拟检查。**真机结果:用户确认 sudo 下 USB 隧道建立成功,项目可模拟定位。**本文未记录连续运行时长或退出后定位恢复的独立测试结果。修改目前保存在本地工作区,尚未提交或推送。

运行命令:

cd ~/Develop/iosrealrun
sudo .venv/bin/python main.py

运行结束时用 Ctrl+C 触发定位清理。若出现新错误,保留从 starting tunnel 开始的完整输出,以便区分 USB 隧道、DVT 服务和定位调用三个阶段。

连接手机时弹出的 MobileDeviceUpdater 窗口负责 macOS 设备支持组件下载。本机当时启用了 127.0.0.1:1082 系统代理;Apple 更新站点在直连和代理下均通过基础连通性检查。下载卡住的具体原因仍待确认。本次项目部署沿用 macOS 15.6.1,未主动安装该弹窗中的组件。

参考资料

  1. 原仓库 README:前置条件、macOS root 权限与 Ctrl+C 退出。
  2. uv 官方文档:虚拟环境。
  3. 原仓库 PR #60:固定 qh3==0.15.1 的建议。
  4. 原仓库 issue #91:iOS 26 QUIC 隧道 ConnectionError。
  5. 原仓库 PR #92:QUIC 失败后回退 TCP,并回传子进程错误。
  6. pymobiledevice3 v9.27.0 tunnel_service.py:PSK/TLS 与 CoreDeviceTunnelProxy 实现。
  7. 原仓库 PR #96:适配 pymobiledevice3 9.x 的异步 API。
  8. 原仓库 PR #93:使用 CoreDeviceTunnelProxy 的 iOS 18+ 修复方案。