一、先说清楚:USB HID 和以前的 iOS 自动化哪里不一样
如果你之前做过安卓自动化,可能会下意识觉得 iOS 得靠越狱、靠签名、靠一堆硬件。但 USB HID 这条路,逻辑完全不一样。
它的原理是:让电脑假装成一个 USB 键盘/鼠标,把点击、滑动、打字这些动作直接送给 iPhone。
HID 是 USB 规范里的设备类别,键盘鼠标都属于它。电脑模拟成 HID 外设之后,iPhone 会把它当成一个真实的外接设备——系统分不出这个信号是真人手指还是程序发的。
因为不碰系统内部,所以:
- 不用越狱,手机保持原样;
- 不用装 App(USB_HID 模式下),所以不用签名;
- 不用买蓝牙板、OTG 板,一根数据线就行。
下面从零开始,把怎么写脚本讲一遍。

二、动手前的准备
1. 环境
- 一台电脑跑中控(Windows 上安装路径请用纯英文);
- iPhone 用数据线连到电脑;
- 确认手机已信任本机、中控桥接已启动。
2. 选对模式
在投屏客户端的系统设置 → 场景模式里,选:
- 无自动化截图 + USB_HID —— 最简单,手机端不装 App,插线即用;
- 主程序录屏 + USB_HID —— 需要装脱机主程序 IPA,换来更流畅的画面。
两种模式都要求手机是 iOS 17 及以上。

3. 记住一条返回约定
所有 usbHidEvent 函数都是同样的返回规则:返回 null 或空字符串是成功,返回其它字符串就是错误信息。
所以写脚本时,先准备一个判断函数,后面会一直用:
function _usbOk(r) {
return r == null || r === "";
}
三、第一个脚本:会话 → 设屏幕 → 点击
USB HID 的操作要在一个“会话”里进行。顺序固定:先开会话,再设屏幕尺寸,然后才是点击和输入。
function main() {
// 1. 开启会话(true 表示启用增强兼容模式)
let r = usbHidEvent.sessionStart(true);
if (!_usbOk(r)) {
logw("开启 USB HID 失败: " + r);
return;
}
// 2. 设置屏幕尺寸,按截图/投屏的实际分辨率填
r = usbHidEvent.setScreenSize(1170, 2532);
if (!_usbOk(r)) {
logw("设置屏幕尺寸失败: " + r);
return;
}
// 3. 点击
r = usbHidEvent.clickPoint(200, 400);
logd("点击: " + (_usbOk(r) ? "成功" : r));
// 4. 收尾,释放资源
usbHidEvent.sessionStop();
}
main();
跑通这三步,你就已经能控制 iPhone 了。剩下的都是在这个骨架上加动作。
会话的三个操作
| 函数 | 用途 | 什么时候用 |
|---|---|---|
sessionStart(gate) |
开启会话 | 脚本开头;会话已存在时会复用 |
sessionRestart(gate) |
重建会话 | 触摸失效、断流、点击没反应时 |
sessionStop() |
关闭会话 | 脚本结束时释放资源 |
sessionRestart 相当于先 stop 再 start,比单独再调一次 sessionStart 更彻底——因为 sessionStart 可能复用旧连接,而 restart 会强制断掉重建。
四、常用函数速查
触控类
| 函数 | 说明 |
|---|---|
clickPoint(x, y) |
单击 |
doubleClickPoint(x, y) |
双击 |
press(x, y, delay) |
长按,delay 是按住毫秒数 |
swipeToPoint(sx, sy, ex, ey, duration) |
从起点滑到终点,duration 是时长毫秒 |
touchDown(x, y) / touchMove(x, y) / touchUp(x, y) |
按下 / 移动 / 抬起,用于需要精细控制的三段式操作 |
multiTouch(touch1, timeout) |
多点轨迹回放,适合复杂手势 |
multiTouch 的轨迹点格式:action 为 0 表示按下、2 表示移动、1 表示抬起,delay 是该点的延迟毫秒。
let touch1 = [
{"action": 0, "x": 100, "y": 500, "delay": 20},
{"action": 2, "x": 100, "y": 300, "delay": 30},
{"action": 1, "x": 100, "y": 300, "delay": 20}
];
usbHidEvent.multiTouch(touch1, 10000);
输入类
| 函数 | 说明 |
|---|---|
typeText(text) |
键盘逐键输入;遇到中文、emoji 自动改粘贴 |
inputText(text) |
统一走剪贴板粘贴,中英文都适用 |
setClipboard(text) |
只写入剪贴板,不粘贴 |
keyPressChar(prefix, code) |
字符键或组合键,如 ("gui", "v") 表示粘贴 |
keyPress(key) / keyUp() |
按下单个键 / 抬起全部按键 |
系统与其他
| 函数 | 说明 |
|---|---|
systemKey(key) |
home 主屏 / recents 多任务 / lock 锁屏 |
volumeUp() / volumeDown() / mute() |
音量与静音 |
setScreenSize(w, h) |
设置屏幕像素宽高,决定后面所有坐标的换算 |
五、坐标怎么写才不点歪
这是新手最容易踩的坑,其实规则就一句话:
先 setScreenSize 设置好设备的像素宽高,之后所有坐标都按截图里的像素写。
也就是说,你截的图里某个按钮在 (200, 400),脚本里就写 clickPoint(200, 400),所见即所得。
两个注意点:
- 横竖屏切换或分辨率变化后,要重新调
setScreenSize,否则坐标会整体偏移; - 横屏时宽高对调即可,例如竖屏是
setScreenSize(1170, 2532),横屏就写setScreenSize(2532, 1170)。
六、用 Python 也能调:HTTP 接口
不想用 EC 脚本,或者你的主程序是 Python / C# / 易语言写的,也没问题。中控开放了 HTTP 接口,与脚本函数一一对应。
- 路径前缀:中控地址,例如
http://127.0.0.1:8019 - 全部是
POST,Content-Type: application/json - 成功时
code为0,失败code非 0、msg是错误信息
举个例子,用 Python 点一下屏幕:
import requests
body = {
"deviceId": "你的设备ID",
"x": 200,
"y": 400
}
r = requests.post("http://127.0.0.1:8019/openapi/usbhidClickPoint", json=body, timeout=30)
print(r.json())
对应关系很直观:
| 脚本函数 | HTTP 接口 |
|---|---|
sessionStart |
/openapi/usbhidSessionStart |
setScreenSize |
/openapi/usbhidSetScreenSize |
clickPoint |
/openapi/usbhidClickPoint |
press |
/openapi/usbhidPress |
swipeToPoint |
/openapi/usbhidSwipeToPoint |
typeText / inputText |
/openapi/usbhidTypeText / /openapi/usbhidInputText |
systemKey |
/openapi/usbhidSystemKey |
建议顺序:先调 usbhidSessionStart,再 usbhidSetScreenSize,然后才做点击与输入——和脚本里的顺序保持一致。

七、新手常踩的坑
- 忘了先设屏幕尺寸:直接点击,位置全偏。养成“会话之后立刻 setScreenSize”的习惯;
- 点击没反应就放弃:多半是会话状态问题,右键设备选「USB HID → 重建 USBHID 会话」通常能解决,比重新跑一遍脚本快;
- 用错输入函数:要打中文却用了
typeText,其实它会自动改粘贴、也能工作;但如果你明确知道是中文,直接用inputText更直接; - 英文粘贴多出空格:手机「设置 → 通用 → 键盘」里关掉「智能标点」即可;
- 依赖 getClipboard 读内容:这个接口在部分 iOS 版本上不稳定,读取人手长按复制的内容可能超时,建议用
setClipboard写入后再读,或改用其他方式传递文本; - 以为插上线就能点击:还要确认手机已信任本机、中控桥接已启动,否则会话根本开不起来。
八、FAQ
- Q:需要装 App 吗? 不需要。「无自动化截图 + USB_HID」模式下手机端不装任何 App,插线即用,也不涉及签名与证书续期。
- Q:不会写代码能用吗? 可以。新中控自带 AI 智能体,用中文对话下达指令即可;也能用可视化工作流拖拽编排。
- Q:函数是同步还是异步? 按同步书写即可,返回
null或空字符串为成功,其它字符串是错误信息。 - Q:坐标写多少才对? 先
setScreenSize设好像素宽高,之后按截图像素写,所见即所得。 - Q:英文和中文输入有区别吗?
typeText逐键输入、遇非英文自动改粘贴;inputText统一走粘贴。 - Q:Python 能调吗? 能。走 HTTP 接口,
POST http://中控IP:8019/openapi/usbhid*,与脚本函数一一对应。 - Q:点击没反应怎么办? 检查连接与信任状态、核对屏幕尺寸,再尝试「重建 USBHID 会话」。
- Q:有哪些做不到的? 擅长操作层动作;读屏幕内容需配合截图接口。
getClipboard在部分 iOS 版本有已知不稳定限制。
相关阅读:想系统了解 iPhone 免越狱自动化的整体方案,可参考 iPhone 免越狱自动化脚本完整教程。
关于 iEasyClick:手机自动化脚本平台,覆盖安卓、iOS、鸿蒙三大生态,支持 EC 脚本开发、AI 智能体对话操控与 USB HID / 蓝牙 HID / OTG HID 多种控制方式。→ 了解全部产品
想要真实跑起来?
本文介绍的方案均可基于 EasyClick 能力在 iEasyClick 落地。官网提供完整文档、开发工具与自动化产品,免费体验。