Wi-Fi Speed Radar is an iOS app for continuous network measurements with live, mode-specific history charts.
This repository is intentionally independent from Android implementation details. Android and iOS codebases evolve separately. You can also check the Android app here: wifi-radar-android. Both repositories are my experiments with AI coding agents, built in my free time for educational purposes only.
- Download speed mode (Mbps)
- Upload speed mode (Mbps)
- Ping mode (ms)
- Live rolling chart for the selected mode
- Network-aware display state (Wi-Fi, mobile data, disconnected)
- About screen with contact and privacy policy links
| Screenshot 1 | Screenshot 2 | Screenshot 3 |
|---|---|---|
![]() |
![]() |
![]() |
- SwiftUI
- Swift Charts
- URLSession async/await
- BSD sockets (
IPPROTO_ICMP) for native ping - NWPathMonitor
- XCTest (unit, integration, UI)
- XcodeGen (project generation)
- Download and upload tests hit Cloudflare speed endpoints (
https://speed.cloudflare.com). - Ping uses native ICMP echo requests implemented with sockets.
- There is currently no HTTP ping fallback in app runtime; UI tests use a synthetic test runtime to avoid flaky network dependencies.
- Xcode 26.3+
- iOS 17+ target
xcodegeninstalled (brew install xcodegen)
xcodegen generateThis creates WiFiRadar.xcodeproj from project.yml.
xcodebuild \
-project WiFiRadar.xcodeproj \
-scheme WiFiRadar \
-destination 'platform=iOS Simulator,name=iPhone 17' \
-derivedDataPath ./DerivedData \
buildIf iPhone 17 is unavailable locally, switch to any installed iPhone simulator name.
./scripts/run-simulator.shNotes:
- This script does a full
clean buildeach run. - Default simulator is
iPhone 17. - You can override with
SIMULATOR_NAMEorSIMULATOR_UDID.
All tests:
xcodebuild \
-project WiFiRadar.xcodeproj \
-scheme WiFiRadar \
-destination 'platform=iOS Simulator,name=iPhone 17' \
-derivedDataPath ./DerivedData \
testUnit tests only (skips integration class):
xcodebuild \
-project WiFiRadar.xcodeproj \
-scheme WiFiRadar \
-destination 'platform=iOS Simulator,name=iPhone 17' \
-only-testing:WiFiRadarTests \
-skip-testing:WiFiRadarTests/PingRunnerIntegrationTests \
testUI tests only:
xcodebuild \
-project WiFiRadar.xcodeproj \
-scheme WiFiRadar \
-destination 'platform=iOS Simulator,name=iPhone 17' \
-only-testing:WiFiRadarUITests/ModeSwitchSmokeUITests \
testIntegration tests only:
xcodebuild \
-project WiFiRadar.xcodeproj \
-scheme WiFiRadar \
-destination 'platform=iOS Simulator,name=iPhone 17' \
-only-testing:WiFiRadarTests/PingRunnerIntegrationTests \
testSpeedAlgorithmsTests:RollingSpeedCalculator, display filters, timeout estimator, andSpeedTestViewModelchart-domain calculations.WorkerPolicyTests:DownloadConcurrencyControllerramp/downscale behavior andBackoffStateretry progression.AppLifecycleTests:SpeedTestViewModelapp lifecycle + connectivity transitions with stubbed workers/network monitor.
PingRunnerIntegrationTests: end-to-end sampling path forPingSpeedRunneragainst live network behavior.- Includes long-running ping sample/stat collection (
testPingRunnerCollectsStableMetrics). - Includes optional Wi-Fi -> cellular -> Wi-Fi transition scenario across modes (
RUN_NETWORK_TRANSITION_ACCURACY=1).
ModeSwitchSmokeUITests: mode switching and live history/value rendering for Download, Upload, and Ping tabs.- Covers no-network placeholder behavior and About sheet interaction contract.
- Runs via debug UI test runtime (
UITestRuntimeFactory) with scripted network sequences.
ios-tests.ymlruns onpushtomainandpull_request.- It performs a simulator-SDK build (
xcodebuild ... -sdk iphonesimulator) without simulator test execution. ios-network-integration.ymlis manual (workflow_dispatch) for ping integration runs, and auto-skips when no iPhone simulator is available on the runner.
This project is licensed under the MIT License. See LICENSE.



