记录日期: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,未主动安装该弹窗中的组件。
参考资料
- 原仓库 README:前置条件、macOS root 权限与 Ctrl+C 退出。
- uv 官方文档:虚拟环境。
- 原仓库 PR #60:固定
qh3==0.15.1的建议。 - 原仓库 issue #91:iOS 26 QUIC 隧道
ConnectionError。 - 原仓库 PR #92:QUIC 失败后回退 TCP,并回传子进程错误。
pymobiledevice3v9.27.0tunnel_service.py:PSK/TLS 与CoreDeviceTunnelProxy实现。- 原仓库 PR #96:适配
pymobiledevice39.x 的异步 API。 - 原仓库 PR #93:使用
CoreDeviceTunnelProxy的 iOS 18+ 修复方案。