1. First, understand why this approach needs no signing
When many people hear “no-signature” they assume it’s some loophole, but the logic is actually plain:
Signing signs “the program that gets installed on the phone.” If you install no program, there is nothing to sign.
The proxy-mode flow is “sign IPA → install on phone → a program on the device executes the actions,” so it can’t avoid signing. USB HID’s no-app-install mode puts the execution on the PC side — the central-control PC emulates a USB keyboard/mouse and feeds touch and key events into the phone over the cable.
With nothing installed on the device, there is naturally no IPA, no certificate, and none of that 7-day-expiry re-signing business.
So the cost structure of this approach is clean: no signing, no jailbreak, no dev board — all you need to prepare is a cable.
2. Preparation: three things
| Item | Notes |
|---|---|
| A computer | Runs the central control. On Windows, install to a pure-English path — no Chinese characters or spaces |
| A cable | Connects the iPhone to the computer; just a normal charging cable |
| System version | The phone needs iOS 17 or later |
No dev board, no certificate, no Apple developer account required.
3. Step 1: pick the right scenario mode (critical)
Open the mirroring client, go to System Settings → Scenario Mode, and select:
No Automation Screenshot + USB_HID
This step decides whether you’ll touch signing later.
| Mode | App installed on phone? | Involves signing? |
|---|---|---|
| USB + Automation Service | Needs a proxy IPA installed | ✅ Yes |
| No Automation Screenshot + USB_HID | No | ❌ No |
| Main Program Screen Recording + USB_HID | Needs an offline main-program IPA installed | ✅ Yes |
After selecting, click Start Mirroring and wait for the phone screen to appear in the main window.
4. Step 2: connect the device and open the session
Confirm two things:
- The phone has trusted this computer;
- The central control’s bridge has started.
Then open a session in your script and set the screen size:
function _usbOk(r) {
return r == null || r === "";
}
function main() {
// 1. Start session (true enables enhanced compatibility mode)
let r = usbHidEvent.sessionStart(true);
if (!_usbOk(r)) {
logw("Failed to start USB HID: " + r);
return;
}
// 2. Set screen size (use the actual screenshot/mirror resolution)
r = usbHidEvent.setScreenSize(1170, 2532);
if (!_usbOk(r)) {
logw("Failed to set screen size: " + r);
return;
}
logd("Environment ready, you can start operating");
}
main();
Never reverse the order: start the session first, then set the screen size, then you can tap and type.
5. Step 3: run your first action
Once the environment is ready, add a tap to try:
r = usbHidEvent.clickPoint(200, 400);
logd("Tap: " + (_usbOk(r) ? "success" : r));
How do you fill in coordinates? Look at the screenshot first — whatever coordinate an element has in the screenshot is what you write in the script — because setScreenSize has already aligned the pixel width and height, it’s WYSIWYG.
6. Complete example: one tap + one input
Put the above together and you get a minimal runnable script:
function _usbOk(r) {
return r == null || r === "";
}
function main() {
let r = usbHidEvent.sessionStart(true);
if (!_usbOk(r)) { logw("Failed to start session: " + r); return; }
r = usbHidEvent.setScreenSize(1170, 2532);
if (!_usbOk(r)) { logw("Failed to set screen size: " + r); return; }
// Tap an input field
r = usbHidEvent.clickPoint(300, 500);
logd("Tap input field: " + (_usbOk(r) ? "success" : r));
// Type English (key-by-key input)
r = usbHidEvent.typeText("hello");
logd("English input: " + (_usbOk(r) ? "success" : r));
// Type Chinese (auto-switches to paste)
r = usbHidEvent.inputText("你好,世界");
logd("Chinese input: " + (_usbOk(r) ? "success" : r));
// Back to home screen
usbHidEvent.systemKey("home");
// Final cleanup: release resources
usbHidEvent.sessionStop();
}
main();
For swiping, long-press, and multi-finger gestures, there are matching functions too:
// Swipe from (100,800) to (100,200) over 500ms
usbHidEvent.swipeToPoint(100, 800, 100, 200, 500);
// Long-press at (300,500) for 800ms
usbHidEvent.press(300, 500, 800);
// Multi-finger trajectory replay: 0=down 2=move 1=up
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);
7. How to confirm you really aren’t on the signing path
Three ways to tell — any one of them being true means you never touched signing:
- Look at the phone: no proxy app installed — with nothing installed, there’s no object to sign;
- Look at the flow: the whole process never showed certificate requests, provisioning-profile installs, or “trust developer” steps;
- Look at durability: leave it alone for a week and it still works — if there were a 7-day personal signature, it would have lapsed long ago.
These three points are also the most comfortable part of this approach: no “expires on schedule” risk.
8. Beginner pitfalls
| Symptom | Cause | Fix |
|---|---|---|
| Session won’t open | Phone hasn’t trusted this computer, or the control bridge isn’t started | Check trust status and the bridge |
| All taps are offset | Forgot setScreenSize, or resolution changed without re-setting |
Set screen size right after the session |
| Tap does nothing | Session state is abnormal | Right-click device → “USB HID → Rebuild USBHID Session” |
| Chinese input garbled | Used typeText for long Chinese | When you know it’s Chinese, use inputText directly |
| Extra spaces when pasting English | System Smart Punctuation is on | Settings → General → Keyboard, turn off “Smart Punctuation” |
| Coordinates break after landscape | Resolution changed but size wasn’t re-set | Swap width/height and re-set in landscape |
9. FAQ
- Q: Can it really be fully no-signature? Yes. Signing targets “the program installed on the phone”; if you install no app, signing never comes up.
- Q: Do I need to buy a dev board? No. The PC emulates a HID peripheral over the cable; your hardware list is just one cable.
- Q: How many steps total? Three: select “No Automation Screenshot + USB_HID” mode, confirm connection and trust, then start the session and set screen size in the script.
- Q: How do I confirm I’m off the signing path? Check whether a proxy app is installed on the phone; no certificate flow throughout; leave it a week and it still works.
- Q: Most common reasons a script won’t run? No session opened first, no screen size set (shows as taps doing nothing), or the phone not trusted / bridge not started.
- Q: Re-run the script if a tap does nothing? No — try “Rebuild USBHID Session” first, faster and more thorough.
- Q: Can it type Chinese? Yes.
typeTextauto-switches to paste for Chinese;inputTextalways uses paste. - Q: System requirements? Both USB_HID modes require iOS 17+; lower versions can only use the signing-required “USB + Automation Service” mode.
Related reading: USB HID for iOS Automation Scripts: Full Tutorial · Bluetooth HID, OTG HID, or USB HID: Which to Choose
About EasyClick: A phone automation AI-agent platform covering Android no-root, iOS no-jailbreak (proxy / Bluetooth HID / OTG HID) and HarmonyOS Next, offering script development, Apple cluster control, local central control & mirroring, and cloud control systems. → Explore all products
Ready to build it for real?
Every approach in this article can be built with EasyClick capabilities on iEasyClick — full documentation, developer tools and automation products, free to try.