iOSUSB HID自动化脚本

USB HID 写 iOS 自动化脚本怎么做?免越狱免签名免硬件的完整教程

手把手教你用 USB HID 做 iOS 自动化脚本:从会话开启、屏幕尺寸设置,到点击、滑动、文字输入、多点触控的完整用法,附 usbHidEvent 代码示例与坐标换算方法,再用 Python 通过 HTTP 接口调一次同样的操作。免越狱、免签名、免硬件,一根数据线即可。

约 12 分钟

一、先说清楚:USB HID 和以前的 iOS 自动化哪里不一样

如果你之前做过安卓自动化,可能会下意识觉得 iOS 得靠越狱、靠签名、靠一堆硬件。但 USB HID 这条路,逻辑完全不一样。

它的原理是:让电脑假装成一个 USB 键盘/鼠标,把点击、滑动、打字这些动作直接送给 iPhone。

HID 是 USB 规范里的设备类别,键盘鼠标都属于它。电脑模拟成 HID 外设之后,iPhone 会把它当成一个真实的外接设备——系统分不出这个信号是真人手指还是程序发的

因为不碰系统内部,所以:

  • 不用越狱,手机保持原样;
  • 不用装 App(USB_HID 模式下),所以不用签名;
  • 不用买蓝牙板、OTG 板,一根数据线就行。

下面从零开始,把怎么写脚本讲一遍。

EasyClick 投屏主界面显示多设备实时画面

二、动手前的准备

1. 环境

  • 一台电脑跑中控(Windows 上安装路径请用纯英文);
  • iPhone 用数据线连到电脑;
  • 确认手机已信任本机、中控桥接已启动。

2. 选对模式

在投屏客户端的系统设置 → 场景模式里,选:

  • 无自动化截图 + USB_HID —— 最简单,手机端不装 App,插线即用;
  • 主程序录屏 + USB_HID —— 需要装脱机主程序 IPA,换来更流畅的画面。

两种模式都要求手机是 iOS 17 及以上

USB HID 投屏预设设置界面

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 的轨迹点格式:action0 表示按下、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),所见即所得。

两个注意点:

  1. 横竖屏切换或分辨率变化后,要重新调 setScreenSize,否则坐标会整体偏移;
  2. 横屏时宽高对调即可,例如竖屏是 setScreenSize(1170, 2532),横屏就写 setScreenSize(2532, 1170)

六、用 Python 也能调:HTTP 接口

不想用 EC 脚本,或者你的主程序是 Python / C# / 易语言写的,也没问题。中控开放了 HTTP 接口,与脚本函数一一对应

  • 路径前缀:中控地址,例如 http://127.0.0.1:8019
  • 全部是 POSTContent-Type: application/json
  • 成功时 code0,失败 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 落地。官网提供完整文档、开发工具与自动化产品,免费体验。

访问 iEasyClick 官网 →