Run over Wi-Fi
Pair an iPhone once, then run Flutter or Compose Multiplatform apps without a USB cable.
Pair once, then drop the cable.
xcross tunnel --wifi
--wifi picks the best path automatically:
USB attachedpairs through the cable, then unplug
Saved pairingreconnects the known device
Nothing savedadvertises a pair-host (iOS 27+)
Then run over Wi-Fi:
xcross flutter run --wifi
xcross compose run --wifi
Recommended first pairing: USB
Works on every iOS 17+ version.
- 1Connect over USB, unlock, tap Trust
- 2Pair and open the tunnel$Wait for
xcross tunnel --wifiDevice ready — paired over USB, wireless RSD tunnel up. - 3Unplug and run$
xcross flutter run --wifi
Pair without USB on iOS 27+
- 1Run the tunnel$It prints a name like
xcross tunnel --wifixcross-my-host-a1b2. - 2On the iPhoneSettings › Privacy and Security › Developer Mode › Paired Devices › Other Devices
- 3Tap the exact printed nameIf a saved pairing failed, a fresh suffixed name appears. Delete the stale one.
- 4Enter the 6-digit codeShown in the terminal.
Device selection
| Flag | Searches |
|---|---|
| none | USB first, falls back to Wi-Fi |
--wifi | Wi-Fi only |
--usb | USB only |
-u <UDID> | one exact device |
Network checklist
Same subnetNo guest isolation, NAT, or VPN in between.
mDNS allowedUDP 5353 must pass.
Phone unlockedScreen on during pairing.
Elevated shell
sudo or Administrator for the tunnel.Troubleshooting
Start with xcross tunnel --wifi -v.
Saved device does not reconnect
Wait for the retry to finish. xcross then advertises a fresh name. On iOS 27+ tap it, on older iOS reconnect USB and rerun.
Host shows on the iPhone, but no code appears
You tapped an older entry. Tap the exact name printed by the current run, and check UDP 5353 is open.
USB connected but not detected (Linux / WSL)
sudo systemctl start usbmuxd
pymobiledevice3 usbmux list --usb
On WSL, check the phone is attached with usbipd and USBMUXD_SOCKET_ADDRESS is set.