Why QA labs use a native phone app instead of the iperf3 CLI
QA labs that test real handset behavior have historically had two bad options. Option one: jailbreak the device and run the iperf3 binary directly. That's only viable on a tiny subset of devices and breaks under modern iOS security. Option two: route the device's traffic through a network bridge and run iperf3 from a wired host pretending to be the device. That measures the bridge, not the device's real Wi-Fi or LTE behavior. A native iPerf3 app on the device under test removes both compromises. It runs on the actual radio, in the actual OS, with the actual networking stack: the same one shipping to end users. For carrier-acceptance and handset firmware QA, that fidelity is the entire point.
Scheduling and automation
On iOS and macOS, the app exposes Apple Shortcut actions and a custom x-callback-url scheme. That makes it trivial to wire into your existing automation. A Shortcut can run on a time-of-day trigger ('every weekday at 03:00 against the lab server'), on a system event ('when this device joins the lab Wi-Fi'), or be invoked from another script. For larger labs, the x-callback-url scheme lets a host machine drive a test on the device via a single URL: call it from your CI pipeline as part of a release-build verification, retrieve the result, fail the build if the throughput regresses. Same model as any other CLI-style tool, with the integrity of running on the device itself.
Result format and database integration
Exported results match the field structure of the standard iperf3 binary: bytes transferred, bits per second, retransmits (TCP), jitter (UDP), packet loss, parallel-stream details, timestamps. CSV is straightforward to ingest into a relational database, time-series store, or spreadsheet. JSON preserves the nested structure if you want to keep per-stream details. For Grafana or similar dashboards, the time-series shape works directly. The point is that you do not have to write a custom parser to bring this data into the lab: anything that already understands iperf3 output understands these exports.