EdgeAlertReceiver is an iOS companion app for Garmin Connect IQ devices (tested with Garmin Edge family) built with SwiftUI + Connect IQ Mobile SDK.
It connects to a user-authorized Garmin device, listens for app messages from a Connect IQ app, and triggers a loud pedestrian alert (bell.wav) on iPhone when a message arrives.
- Connect IQ SDK integration (iOS)
- Device selection through Garmin Connect Mobile
- Device event lifecycle handling
- App message reception from Connect IQ app
- Loud iPhone audible alert on incoming message
- Uses
Assets.xcassets/bell.dataset/bell.wav - Plays 3 quick hits for high noticeability
- Uses
- Structured runtime logs for debugging and diagnostics
- SwiftUI
- UIKit app delegate bridge
- Garmin Connect IQ Mobile SDK (
ConnectIQ) - AVFoundation for audio alert playback
EdgeAlertReceiver/EdgeAlertReceiverApp.swift- App entry point
- SDK initialization
- URL and universal-link callback routing
EdgeAlertReceiver/ConnectIQManager.swift- Connect IQ orchestration
- Device selection parsing
- Device/app message registration
- Status and diagnostics logging
EdgeAlertReceiver/BellAlertPlayer.swift- Alert sound playback engine
EdgeAlertReceiver/ContentView.swift- Minimal UI and connect action
- Xcode 15+
- iOS device (physical device recommended)
- Garmin Connect Mobile installed on iPhone
- Garmin device paired with Garmin Connect Mobile
- Connect IQ app installed on Garmin device (matching UUID used in app)
Open:
EdgeAlertReceiver.xcodeproj
In EdgeAlertReceiver/ConnectIQManager.swift, set:
appUUIDstoreUUID
These must match your Connect IQ app.
Already included in this project:
- URL scheme:
edgealertreceiver LSApplicationQueriesSchemescontainsgcm-ciq- Bluetooth usage description keys
CFBundleDisplayName
Use a real iPhone for full BLE and Garmin Connect interaction.
- App initializes Connect IQ SDK at startup.
- User taps Connect to Garmin Device.
- App opens Garmin Connect Mobile device selection.
- Garmin Connect returns authorized devices via callback URL.
- App parses selected device and registers:
- Device event delegate
- App message delegate (after
deviceCharacteristicsDiscovered)
- When a Connect IQ message arrives, app:
- Updates UI text
- Plays loud bell alert (
bell.wav) 3 times quickly
Logs are prefixed with:
[ConnectIQ]
Useful events to watch:
showDeviceSelection requestedonOpenURL/continueUserActivityparseDeviceSelectionResponse count=...deviceStatusChanged ...deviceCharacteristicsDiscovered ...getAppStatus isInstalled=...receivedMessage ...
- Ensure URL scheme in Info.plist matches SDK initialization scheme.
- Ensure Garmin Connect Mobile is installed (not only Garmin Connect web account).
- Reinstall app after changing URL/callback settings.
- Confirm callback logs in app delegate / SwiftUI
onOpenURL.
- Confirm app UUID/store UUID are correct.
- Confirm Connect IQ app is installed on the Garmin device.
- Check
getAppStatus isInstalled. - Ensure your Connect IQ app is actually sending mailbox messages.
- iOS does not allow apps to override system volume beyond user/device settings without Critical Alerts entitlement.
- This app already uses a custom bell + playback session and repeated hits for maximum non-critical alert volume.
- Device metadata is cached locally via
UserDefaultsfor reconnection flow. - No backend or cloud dependency is required for current behavior.
- In-app device diagnostics panel (status, app install status, last callback timestamp)
- Message type filtering / prioritization
- Haptic pattern customization
- Foreground/background alert policy controls
MIT. See LICENSE.