iOS 真机 JS 注入 · 第 6 课(番外)
前 5 课的分工是「人把 webview 打开、AI 从 webview 起探针」。这一课问一个更贪心的问题: 连"冷启动飞书、点到目标 webview"这段也让 AI 自己做,行不行?——真机试了一整轮。 结论很有教育意义:能力是有的,但被一堵"策略墙"挡死,而这堵墙直到最后一步才露出铁证。 下面把排查过程一层层还原,并说明怎么认出"这不是技术问题,而是制度边界"。
很多人以为 iOS 自动化必须上 WDA / Appium / 越狱。其实 pymobiledevice3 developer core-device 里,
苹果原生就给了一套——不需要任何第三方框架,也不需要 full Xcode:
把它们串起来就是一个闭环:截屏 → 判断该点哪 → tap → 再截屏。原理上,AI 完全可以自己在飞书里点来点去。 所以"AI 能不能自己开 webview"——能力层面答案是能。问题出在能力前面的一排"闸门"。
上面那套 core-device 能力,全部要求两个前置:① 设备开启「开发者模式」② 挂载 DDI(DeveloperDiskImage)。
我按顺序去开,一路撞墙——注意,撞墙不可怕,关键是每撞一堵就判断"这堵能不能绕":
api.github.com 下,直连恒超时(DNS 落 Clash fake-ip)。能绕:走 Clash 代理,逐个端口试出 7897 通(7890 不通)。--userspace 免 root,但挂载时报 NotImplementedError: RemoteXPC ... RemoteServiceDiscoveryService。能绕:改用 sudo pymobiledevice3 remote tunneld 起真 RSD 隧道,命令加 --tunnel <UDID>。enable-developer-mode 报「设了密码就不许开」;「设置>隐私与安全性」底部的开发者模式菜单做了干净的开发者服务连接(设备回 Developer Mode is disabled)、划掉重开 Settings、整机重启,始终不出现。绕不动。前两堵墙都绕过去了(技术障碍),第三堵怎么都过不去。这时候要警觉:一堵"你做对了所有步骤它还是不动"的墙,往往不是技术问题。
我想了个巧招绕开第三堵:既然报错是"设了密码就不许开",那把锁屏密码临时关掉不就行了?于是去 设置 > 面容 ID 与密码 > 关闭密码——
「关闭密码」按钮是灰的,根本点不动。
这一下就是铁证:一个按钮变灰、不让你关密码,只有一种解释——有一个管理描述文件在"强制要求你必须设密码"。 换句话说,这台机器被企业安全策略实际管着。
回头用 pymobiledevice3 profile list 一查,果然装着字节 Seal 的管理描述文件。
而"强制密码"这种安全 baseline,几乎必然同时带着"禁用开发者模式"——这就完美解释了第三堵墙:
不是我操作不对,是开发者模式被公司策略从根上关掉了,菜单当然永远不会出现。
在被字节 Seal 管控(强制密码)的 iOS 机上,iOS 全 UI 自动化走不通——
core-device 的 launch/tap/截屏全要开发者模式,而开发者模式被策略锁死。
唯一的解锁办法是移除管理描述文件,但那会让你掉出公司管控、丢掉企业应用权限,属于违规——不做。
这里最值钱的,不是那些命令,而是这个判断力:当"做对了每一步还是不动"时,要能识别出自己撞的是制度墙而不是技术墙,然后果断止损、换路,而不是无限地往死胡同里加班。
HTTPS_PROXY=http://127.0.0.1:7897 pymobiledevice3 mounter auto-mount ...(Clash 端口逐个试,7897 通)。sudo pymobiledevice3 remote tunneld 起真隧道 + 命令加 --tunnel <UDID>。pymobiledevice3 profile list(有无企业 MDM 描述文件)、amfi developer-mode-status;「设置里关密码按钮变灰」是策略强制密码的最直接体感证据。