iCTRL
OpenMinis/iCTRL加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。

想象这样一个场景:你手上有一台 iPhone,想让 AI 智能体替你完成一件只能在手机上做的事——比如登录某个 App、翻到某个页面截图、把一段文字填进某个只有 iOS 才有的小工具里。传统的做法是找 Appium 的 WebDriverAgent,起一个 Mac,配好 Xcode 证书,敲一堆脚本。折腾下来半小时过去了,还没点完第一个按钮。
iCTRL(iOS ConTrol)换了个思路:既然 AI 智能体最擅长的事情是"读文档然后调用 API",那为什么不把 iPhone 直接做成一个自带说明书的服务端?
于是有了这样的一幕:你只对智能体说一句——
"我的 iPhone 上跑着 iCTRL,地址是 192.168.1.20:8200,你自己想办法把它开起来。"
智能体随后自己去 GET /skill 拉取一份完整的中英文操作手册,再去 GET /schema 把每个方法的参数文档读一遍,然后 POST /pair 发起配对。手机屏幕右上角弹出一条通知:"是否允许此客户端连接?" 你点一下"允许",剩下的事情——点击、滑动、输入、读屏、截图、启动 App——就都归它了。
这就是 iCTRL 的全部野心:不写脚本,让模型现场自学怎么操作手机。

要理解 iCTRL 的设计取舍,得先理解 iOS 自动化的困境。
第一道墙是 XCUITest 的"安静等待"。 XCUITest 每次点击前会等应用"进入空闲状态",默认最长等 10 秒。这对跑测试用例是合理的,但当 Agent 需要连续操作时,每一步都在白白浪费时间。iCTRL 的做法是绕开这套机制,直接用 XCSynthesizedEventRecord 和 XCPointerEventPath 合成触摸事件——实测中位延迟约 280 毫秒,比 WebDriverAgent 快三到五倍。
第二道墙是屏幕快照的体积。 WebDriverAgent 的快照限制深度到 50 层,但不限制宽度,于是在一个长滚动的 Twitter 时间线上,每一行屏幕外的行都要被序列化,读取一次要几秒甚至超时。iCTRL 在设备端同时限制深度和宽度,只保留屏幕上真实可见的内容。实测 8 个 App 的 p50 是 416 毫秒,p90 是 593 毫秒,没有一次超过 1 秒。
第三道墙是"看不见的界面"。 很多 App 用 WebView 或自绘渲染,辅助功能树返回的是空的。iCTRL 用 Apple Vision 做设备端 OCR,识别出文字并给出可点击坐标;而且 page_source 会自己测量辅助树的覆盖率,覆盖率不够时自动降级到 OCR。
第四道墙,也是最关键的一道:模型怎么"知道"能做什么。 这是 iCTRL 和所有传统自动化框架最本质的区别。
如果要用一个类比,iCTRL 最像的不是 Appium,而是一台80 年代的示波器——它没有图形界面,屏幕上只有一行行文本命令,但只要给你一份完整的指令手册(比如 HP 2000 的那本 400 页操作手册),你完全能把它用起来。
更贴切的类比是航空母舰的舰桥指挥系统。
普通自动化脚本像"把操作步骤一步步教给一个新人",每一步都要显式描述"点击哪里"。而 iCTRL 是给智能体一整套权限与仪表盘:它能读出当前所有仪表面板的状态(辅助功能树 + OCR),能自己判断"现在前台的到底是哪个 App",遇到异常还能自己查日志、复位、断路器保护。也就是说,Agent 拿到的是驾驶舱,不是导航路线。
作者自己说得很直白:iCTRL 的设计目标是"让设备自己提供操作手册",Agent 从手册开始学,需要哪块再深入查 schema。这是典型的**渐进式披露(progressive disclosure)**设计——把 80KB 的 API 文档压缩成一个 15K 字符以内、"最重要的规则排最前面"的手册。
JSON-RPC 2.0 over HTTP,默认端口 8200,方法族划分得很清楚:
tap、double_tap、long_press、swipe、scroll、scroll_to_element、drag、pagetype(支持 submit / clear)、clear_textscreenshot、page_source、find_element、screen_text(Vision OCR)launch_app、activate_app、terminate_app、list_apps、resolve_app、open_urldevice_info、home、lock、unlock、is_locked、waitconfig、reset、stream_ticket最有意思的是 drag 的一处细节:它支持传入一个 points 数组来画连续折线,每段至少保持一帧(约 17 毫秒),因为接收方 App 是每帧读一次触摸的,段太短会让拐角被抹平。这是一个只有真正踩过坑的人才会写出来的约束。
这是 iCTRL 最值得学习的设计。所有返回值都带 hint,所有错误都告诉你"接下来该干什么":
ref 在点击时重新解析活元素,避免页面刷新后句柄失效visibility 和 alternatives 帮你识别"长得一样的元素",避免点错对于大模型来说,这些字段就是天然的思维链脚手架——模型不需要猜下一步,直接读 hint 就行。
自动化设备被劫持是很现实的威胁。iCTRL 的防线是分层的:
K = token_ct XOR HMAC(HMAC(X25519(c_priv,d_pub), "ictrl-pair"||c_pub||d_pub), "ictrl-wrap")这是 iCTRL 最反直觉的设计:iOS 自动化通常离不开 Mac(构建、签名、驱动),iCTRL 想把这层拆掉。
解决办法是两条路:
PlugIns/iCTRLUITests.xctest,这个插件必须先单独签名且要带 runner 的 bundle id,而大多数签名工具(如 ldid)只会递归处理 .framework / .appex,漏掉 .xctest——结果就是装得上、启动即崩。testmanagerd 守护进程,而它只在 Developer Disk Image 挂载时存在,且重启即失效。iOS 17.4+ 之后开发者服务搬到了 RSD(RemoteServiceDiscovery)后面,必须走 StosVPN/LocalDevVPN → lockdownd → idevice(Rust) → image_mounter 这四层栈。好消息是 LocalDevVPN 只是个数据包反射器,只路由 10.7.0.0/24,默认路由被显式排除,不抓真实流量。设备会把客户端直接从自己这里发给你:curl -o ictrl_rpc.py http://<ip>:8200/skill/clients/python 就能拿到一个只用标准库的参考客户端。另外还有一个 aarch64-musl 纯静态 C CLI,启动比 Python 快约 9 倍,专门给没有 Python 的设备沙箱用。
| 路径 | 需要什么 | 难度 |
|---|---|---|
| SideStore 全流程 | iLoader + LocalDevVPN + SideStore + 配对文件 + 证书信任 | ★★★★ |
| 付费账号 + 脚本签名 | Mac + 证书 + 描述文件 + Scripts/sign-ipa.sh | ★★★ |
| 付费账号 + Xcode | Mac + Xcode + XcodeGen,make build | ★★ |
即使是最简单的路径,用的人也得知道:什么是 Developer Mode、什么是配对文件、什么是 DDI、为什么要装 LocalDevVPN。项目的 README 里甚至专门写了一节"这三种情况看起来很像同一个 bug"(Runner 开了就关:通常是 DDI 没挂载 / .xctest 没签名 / 免费证书过期),可见踩坑之深。
另外注意免费 Apple ID 的硬限制:证书 7 天过期、同时只能侧载 3 个 App(SideStore 自己占一个),也就是说用 iCTRL App 挂 DDI 的话,就没法再装 StikDebug 了,二选一。
如果你的团队里有 Mac 和 Xcode,最快的路径其实是第三条;如果你手头只有 Windows/Linux 和一台 iPhone,那第一条路的复杂度是真实的。
局限一:这不是给生产环境用的。 项目用了大量私有 XCTest 和 LSApplicationWorkspace API,明确不是 App Store 安全的,只能用于自有设备。list_apps 在新版本 iOS 上可能直接返回空列表。
局限二:解锁能力有限。 unlock 只能唤醒屏幕,不能输入密码,也不能保持屏幕常亮。长时无人值守任务需要手动把"自动锁定"设为"永不"。好消息是息屏不影响 Runner 运行,只读任务在黑屏状态下照常工作。
局限三:屏幕流未加密。 H.264 推流在任何通道上都是明文,只有 JSON-RPC 请求体是加密的。
局限四:反自动化风控依然存在。 合成触摸在系统层与真实触摸不可区分,但这不保证能绕过 App 侧的机器人检测。
局限五:磁盘占用的历史坑。 Xcode 15 之后 UI 测试默认会录屏并存到手机 tmp/Attachments,测试不通过就永久留下。一个跑了几小时被强杀的服务端测试,一次就留下几十 GB 的视频,重启也清不掉。项目专门提供了 Scripts/clean-xctest-attachments.sh 来清理。
许可证变更。 1.32.0 之前是 AGPL-3.0,之后改为 Apache-2.0,原因写在 NOTICE.md 里。如果你是要集成到闭源商业产品,注意确认你使用的是哪个版本。
iCTRL 发布于 2026 年 7 月,四个月不到拿到 563 星、250 次提交,README 里的性能数字全是实测值(不是估算),这在开源项目里并不常见。它折射出的是一条清晰趋势线:
第一阶段(2023-2024):浏览器自动化。 Playwright、Selenium 让 Agent 能操作网页。
第二阶段(2025):桌面自动化。 Claude Computer Use、computer-use 类模型出现,但需要截图-推理-点击的慢循环。
第三阶段(2026 至今):移动端 + 原生接口。 iCTRL 代表的路线不是给模型一个像素坐标让它猜,而是直接给出结构化的、带语义和提示的原生 API。这在工程上是对的:结构化信息比像素可靠得多,速度也快一个数量级。
更重要的是它对**"模型如何获取工具"这个问题的回答:不再依赖预训练里塞一堆 API 文档,而是让工具自己 served 一份运行时手册**(GET /skill + GET /schema)。Agent 无需重新训练、无需人工 brief,拿到地址就能用。"工具自带说明书"这个模式,比"工具需要被文档化"更接近自治。
iCTRL 也顺带给 Open Minis 项目(一个端侧 AI 智能体 App)造了基础设施——iCTRL 本身就是 OpenMinis 组织下的仓库,描述里点名了 Codex、Claude Code、Hermes、OpenClaw、Minis。它不是孤立的工具,而是"端侧智能体 + 手机控制"这套组合拳里的"手"。
适合:
不适合:
数据来源:GitHub API(实时拉取,563★ / 54 fork / 3 contributors / 251 commits)+ 仓库 README、SKILL.md、project.yml、iCTRLKit 与 iCTRLUITests 源码结构。