一、先搞懂:为什么这套方案不用签名
很多人一听“免签名”就觉得是钻空子,其实逻辑很朴素:
签名签的是“要装到手机上的那个程序”。 如果不装程序,就没有东西需要签。
代理模式的流程是“签名 IPA → 安装到手机 → 手机端程序执行操作”,所以绕不开签名;而 USB HID 的免装 App 模式把执行主体放在了电脑侧——中控电脑模拟成一个 USB 键鼠,通过数据线把触摸和按键事件送进手机。
手机端什么都没装,自然也就没有 IPA、没有证书、没有 7 天到期重签这些事。
所以这套方案的成本结构很干净:不签名、不越狱、不买开发板,你要准备的只有一根数据线。
二、准备工作:三样东西
| 准备项 | 说明 |
|---|---|
| 一台电脑 | 跑中控,Windows 上安装路径请用纯英文,不要中文和空格 |
| 一根数据线 | 连接 iPhone 与电脑,就是普通充电线那种 |
| 系统版本 | 手机需 iOS 17 及以上 |
不需要开发板,不需要证书,不需要 Apple 开发者账号。
三、第一步:选对场景模式(关键)
打开投屏客户端,进入系统设置 → 场景模式,选:
无自动化截图 + USB_HID
这一步决定了你后面要不要碰签名。
| 模式 | 手机装 App? | 涉及签名? |
|---|---|---|
| USB + 自动化服务 | 需要装代理 IPA | ✅ 需要 |
| 无自动化截图 + USB_HID | 不需要 | ❌ 不需要 |
| 主程序录屏 + USB_HID | 需要装脱机主程序 IPA | ✅ 需要 |
选好后点开始投屏,等主窗口出现手机画面即可。
四、第二步:连接设备、开启会话
确认两件事:
- 手机已信任本机;
- 中控的桥接已启动。
然后在脚本里开会话,并设置屏幕尺寸:
function _usbOk(r) {
return r == null || r === "";
}
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;
}
logd("环境就绪,可以开始操作了");
}
main();
顺序千万别颠倒:先开会话,再设屏幕尺寸,然后才能做点击输入。
五、第三步:跑通第一个动作
环境就绪后,加一个点击试试:
r = usbHidEvent.clickPoint(200, 400);
logd("点击: " + (_usbOk(r) ? "成功" : r));
坐标怎么填?先看截图,元素在截图里是什么坐标,脚本里就写什么坐标——因为 setScreenSize 已经把像素宽高对齐了,所见即所得。
六、完整示例:一次点击 + 一次输入
把前面的拼起来,就是一个能跑的最小脚本:
function _usbOk(r) {
return r == null || r === "";
}
function main() {
let r = usbHidEvent.sessionStart(true);
if (!_usbOk(r)) { logw("开启会话失败: " + r); return; }
r = usbHidEvent.setScreenSize(1170, 2532);
if (!_usbOk(r)) { logw("设置屏幕尺寸失败: " + r); return; }
// 点击某个输入框
r = usbHidEvent.clickPoint(300, 500);
logd("点击输入框: " + (_usbOk(r) ? "成功" : r));
// 输入英文(逐键输入)
r = usbHidEvent.typeText("hello");
logd("英文输入: " + (_usbOk(r) ? "成功" : r));
// 输入中文(自动改为粘贴)
r = usbHidEvent.inputText("你好,世界");
logd("中文输入: " + (_usbOk(r) ? "成功" : r));
// 回到主屏
usbHidEvent.systemKey("home");
// 收尾释放资源
usbHidEvent.sessionStop();
}
main();
想滑动、长按、多点手势也有对应函数:
// 从 (100,800) 滑到 (100,200),耗时 500ms
usbHidEvent.swipeToPoint(100, 800, 100, 200, 500);
// 在 (300,500) 长按 800ms
usbHidEvent.press(300, 500, 800);
// 多点轨迹回放:0=按下 2=移动 1=抬起
let t = [
{"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(t, 10000);
七、怎么确认自己真的没走签名链路
三个判断依据,任一条满足即可说明没碰签名:
- 看手机:没有安装任何代理 App——没装东西,就没有可签名的对象;
- 看流程:全程没有出现证书申请、描述文件安装、信任开发者这些步骤;
- 看时效:放一周不管,功能照常——如果存在 7 天个人签,早就失效了。
这三条也是这套方案最舒服的地方:没有“到点就失效”的隐患。
八、新手常踩的坑
| 现象 | 原因 | 解决 |
|---|---|---|
| 会话开不起来 | 手机未信任本机,或中控桥接未启动 | 检查信任状态与桥接 |
| 点击位置全偏 | 忘了设 setScreenSize,或分辨率变了没重设 |
会话后立刻设屏幕尺寸 |
| 点击没反应 | 会话状态异常 | 右键设备 →「USB HID → 重建 USBHID 会话」 |
| 中文输入乱码 | 用了 typeText 处理长中文 | 明确是中文时直接用 inputText |
| 英文粘贴多空格 | 系统智能标点开了 | 设置 → 通用 → 键盘,关掉「智能标点」 |
| 横屏后坐标错乱 | 分辨率变了但没重设尺寸 | 横屏时宽高对调重设一次 |
九、FAQ
- Q:真的可以完全不签名吗? 可以。签名针对“要装到手机上的程序”,不装 App 就不涉及签名。
- Q:需要买开发板吗? 不需要。电脑模拟 HID 外设走数据线,硬件清单里只有一根线。
- Q:一共几步? 三步:选「无自动化截图 + USB_HID」模式、确认连接与信任、脚本里开会话并设屏幕尺寸。
- Q:怎么确认没走签名链路? 看手机是否装了代理 App;全程无证书流程;放宽一周功能照常。
- Q:脚本跑不起来最常见的原因? 没先开会话、没设屏幕尺寸(表现为点击无反应)、手机未信任或桥接未启动。
- Q:点击没反应要重跑脚本吗? 不用,先试「重建 USBHID 会话」,更快也更彻底。
- Q:能输入中文吗? 能。
typeText遇中文自动改粘贴,inputText统一走粘贴。 - Q:对系统有要求吗? 两种 USB_HID 模式要求 iOS 17+;更低版本只能用需要签名的「USB + 自动化服务」模式。
相关阅读:USB HID 写 iOS 自动化脚本怎么做?完整教程 · 蓝牙 HID、OTG HID、USB HID 三种方式怎么选
iEasyClick:安卓 / 苹果 / 鸿蒙全平台手机自动化,支持 EC 脚本开发、AI 智能体对话操控与 USB HID / 蓝牙 HID / OTG HID 多种控制方式 · 官网 ieasyclick.net
想要真实跑起来?
本文介绍的方案均可基于 EasyClick 能力在 iEasyClick 落地。官网提供完整文档、开发工具与自动化产品,免费体验。