iOSUSB HID自动化脚本

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

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

约 13 分钟

一、USB HID 和以前的 iOS 自动化到底哪里不一样?

核心区别:电脑伪装成 USB 键鼠直接发指令,全程免越狱免签名免硬件。

如果你之前做过安卓自动化,可能会下意识觉得 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 === "";
}

三、第一个脚本怎么写,顺序是什么?

三步即可控住 iPhone:开会话、设屏幕尺寸、再点击输入,顺序不能乱。

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 会强制断掉重建。

四、USB HID 常用函数有哪些?

常用函数分三类:触控、输入、系统按键,覆盖点击滑动打字与音量等。

触控类

函数 说明
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 再按截图像素写坐标,就能所见即所得、不点歪。

这是新手最容易踩的坑,其实规则就一句话:

先 setScreenSize 设置好设备的像素宽高,之后所有坐标都按截图里的像素写。

也就是说,你截的图里某个按钮在 (200, 400),脚本里就写 clickPoint(200, 400),所见即所得。

两个注意点:

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

六、不用 EC 脚本,Python 能调 USB HID 吗?

能。中控开放 HTTP 接口,POST + JSON,与脚本函数一一对应,Python 可直接调。

不想用 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,然后才做点击与输入——和脚本里的顺序保持一致。

中控设备分组与批量管理界面

七、新手写 USB HID 脚本常踩哪些坑?

最常踩:忘设屏幕尺寸、点击无响应就放弃、用错输入函数、依赖 getClipboard。

  • 忘了先设屏幕尺寸:直接点击,位置全偏。养成“会话之后立刻 setScreenSize”的习惯;
  • 点击没反应就放弃:多半是会话状态问题,右键设备选「USB HID → 重建 USBHID 会话」通常能解决,比重新跑一遍脚本快;
  • 用错输入函数:要打中文却用了 typeText,其实它会自动改粘贴、也能工作;但如果你明确知道是中文,直接用 inputText 更直接;
  • 英文粘贴多出空格:手机「设置 → 通用 → 键盘」里关掉「智能标点」即可;
  • 依赖 getClipboard 读内容:这个接口在部分 iOS 版本上不稳定,读取人手长按复制的内容可能超时,建议用 setClipboard 写入后再读,或改用其他方式传递文本;
  • 以为插上线就能点击:还要确认手机已信任本机、中控桥接已启动,否则会话根本开不起来。

八、关于 USB HID 脚本还有哪些高频疑问?

以下 FAQ 覆盖装 App、编码门槛、同步异步、坐标与 Python 调用等疑问。

  • 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 官网 →