Highlights
✨ Much faster --userspace tunnel transfers via dynamic send-MSS
The userspace tunnel no longer caps host→device segments at a static 1340 bytes. Riding pmd-pytcp 0.2.0's fixed RFC 4821/8899 path probing, every connection starts at that same proven-safe size and raises its MSS only through packet sizes the device has actually ACKed — so each device/transport converges to its own real forwarding limit within a couple of seconds, with nothing hardcoded and a worst case equal to the old behavior on any device.
Measured on an iPhone 17,3 (iOS 26.5, USB), 100 MB afc transfers:
- upload: 9.1 → ~25 MB/s (CLI wall time 16.1 s → 4.8 s)
- download: ~65 → ~85 MB/s; DSC
fetch-symbols: 63 → 79 MB/s
# no root needed — and now several times faster
pymobiledevice3 afc push --userspace big_file.bin big_file.bin
pymobiledevice3 developer fetch-symbols download --userspace ./symbolsThe download-side gains come from pmd-pytcp's new runtime log gate (the pure-Python TCP stack no longer formats debug strings per packet when logging is off).
✨ Byte-scaled progress bars for afc push/pull
Single-file transfers over 4 MB now show a proper bytes progress bar with a live rate in both directions — handy as an ad-hoc transfer benchmark:
$ pymobiledevice3 afc push --userspace test.bin test.bin
test.bin: 52%|█████▏ | 52.0M/100M [00:04<00:03, 14.6MB/s]pull's bar previously counted opaque 4 MB chunks; push had no bar at all and read the whole file into memory — it now streams in 4 MB chunks, which also removes the whole-file memory footprint for large uploads. AfcService.push() gains a progress_bar=True parameter mirroring pull()'s.
🐛 afc pull no longer demands --ignore-errors
A missing option default made typer treat --ignore-errors as required, breaking every plain afc pull <remote> <local>. Plain pulls work again (strict by default; -i opts into best-effort).
What's Changed
- b180e59 Merge pull request #1780 from doronz88/bugfix/afc-pull-ignore-errors-default (#1780) (@doronz88)
- ca44e1c afc: byte-scaled progress bars for single-file push and pull (#1780) (@doronz88)
- 815152c afc: make pull's --ignore-errors optional again (#1780) (@doronz88)
- 5f87339 Merge pull request #1779 from doronz88/perf/userspace-dynamic-mss (#1779) (@doronz88)
- c3cea12 userspace_tunnel: dynamic send-MSS via PLPMTUD — discover each device's real packet limit (#1779) (@doronz88)
Full Changelog: v9.36.3...v9.37.0