手机上的 Agent,终于开始操作真实 iPhone 了。
过去想要让 Claude、Codex 操作手机,一般都离不开模拟器、ADB 或者专门的自动化框架。到了 iPhone 上更麻烦:Xcode、WebDriverAgent、签名、开发者配置,光环境搭建就折腾半天。
最近 GitHub 上一个叫 phone-harness 的开源项目(2.3K Star)给出了不同的思路:让 AI Agent 直接操作你手里的真实 iPhone,不需要越狱,也不需要安装 WebDriverAgent。中间真正用到的桥梁,是苹果自己的 iPhone Mirroring(iPhone 镜像)。

原理:控制 iPhone 镜像窗口
phone-harness 没有直接去控制 iOS 系统,而是控制 Mac 上的 iPhone 镜像窗口。iPhone Mirroring 本来就可以把手机画面显示到 Mac 上,同时接收鼠标和键盘操作。phone-harness 就利用了这一点,整个过程可以理解为三步:看屏幕 → 找位置 → 点下去。
它先截取 iPhone 镜像窗口,再通过苹果 Vision Framework 做 OCR。识别出的不只是文字,还包括文字在屏幕上的坐标。这样 Agent 看到"地图"之后,就知道应该点哪里。

Agent 是怎么点手机的
找到坐标之后,phone-harness 使用 macOS 的 CGEvents 模拟输入,把点击、长按、滑动、滚动、输入文字等操作送进 iPhone 镜像窗口。它还封装了几个实用的操作:
home()回到桌面open_app("Notes")打开备忘录tap_text("New Note")找到文字并点击type_text("hello")输入内容
从 Agent 的角度看,不需要研究底层怎么控制 iPhone,只需要调用这些现成能力。

每一步都会重新确认
网页自动化可以读取 DOM,知道按钮、输入框现在是什么状态。iPhone 镜像没有这些东西。所以 phone-harness 的处理方法很简单:操作完,再看一眼。
比如说让 Agent 打开天气应用:先用 OCR 找到 Weather 图标,点击对应坐标,等待页面稳定,然后再截图做 OCR,确认天气页面是否真的打开了。手机上显示出来的画面就是最后的判断依据。

找不到文字怎么办
OCR 很适合处理带文字的按钮,但手机里还有大量没有文字的图标。phone-harness 有两只"眼睛":有文字的地方先用 OCR,速度快,坐标也清楚;没有文字的地方就让视觉模型看截图,判断图标的位置并计算坐标进行点击。

Agent 可以自己补工具
这个项目比较有 Harness 味道的地方在 agent-workspace。里面有一个 agent_helpers.py,核心代码负责截图、OCR、点击这些基础能力,保持稳定。而任务需要的额外能力,可以让 Agent 自己写入到 agent_helpers.py 中。遇到重复操作时,Agent 可以给自己补一个 helper,下次直接调用。
底层提供手和脚,Agent 根据任务给自身补充工具。这也是它和一般手机自动化脚本不一样的地方。

安装:让 Agent 自己装
作者给出的安装方式也很有意思:直接把一段 Setup Prompt 丢给 Codex 或 Claude,让 Agent 自己克隆项目、读取 install.md、安装依赖,再注册成 phone-harness Skill。真正需要人操作的主要有两件事:第一次将 iPhone 和 Mac 的 iPhone Mirroring 进行配对,然后为终端开启 Accessibility 和 Screen Recording 权限。安装完毕之后运行 phone-harness --doctor 就可以检查整条控制链路有没有正常工作。

目前的限制
phone-harness 现在更像一个轻量实验项目,还不是完整的 iPhone 自动化平台。主要限制包括:一次只能控制一台手机;实体 iPhone 解锁后镜像会暂停;不支持多点触控(双指缩放做不了);相机、Face ID 流程有限制,DRM 视频会显示黑屏;OCR 只能识别文字,无标签图标需要视觉模型判断。
写在最后
phone-harness 最有意思的地方,不是又做了一套手机自动化框架,而是很轻——直接借用苹果已经提供的 iPhone Mirroring,把 Mac 变成 Agent 和真实 iPhone 之间的桥梁。Agent 用截图和 OCR 看手机,用 CGEvents 去点击,再重新截图确认结果。整条链路很容易理解。
开源地址:https://github.com/ShawnPana/phone-harness