iOS BLE Background Scanning Stops After Few Minutes to Hours
Hi everyone,
I'm developing a Flutter app using flutter_blue_plus that needs continuous BLE scanning in both foreground and background. Foreground scanning works perfectly, but background scanning stops after a few minutes (sometimes 1-2 hours).
Current Implementation (iOS)
Foreground Mode:
Scans for 10 seconds with all target service UUIDs
Batches and submits results every 10 seconds
Works reliably ✅
Background Mode:
Rotates through service UUIDs in batches of 7
Uses 1-minute batch intervals
Maintains active location streaming (Geolocator.getPositionStream)
Switches modes via AppLifecycleState observer
// Background scanning setup
await FlutterBluePlus.startScan(
withServices: serviceUuids, // Batch of 7 UUIDs
continuousUpdates: true,
);
// Location streaming (attempt to keep app alive)
LocationSettings(
accuracy: LocationAccuracy.bestForNavigation,
distanceFilter: 0,
);
Lifecycle Management:
AppLifecycleState.paused -> Start background mode
AppLifecycleState.resumed -> Start foreground mode
Questions:
Is there a documented maximum duration for iOS background BLE scanning? My scanning stops inconsistently (few minutes to 2 hours).
Does iOS require specific Background Modes beyond location updates to maintain BLE scanning? I have location streaming active but scanning still stops.
Are there undocumented limitations when scanning with service UUIDs in background that might cause termination?
Should I be using CoreBluetooth's state preservation/restoration instead of continuous scanning?
Info.plist Configuration:
<key>UIBackgroundModes</key>
<array>
<string>bluetooth-central</string>
<string>location</string>
</array>
Additional Context:
Total service UUIDs: ~20-50 (varies by company)
Scanning in batches of 7 to work around potential limitations
Android version works fine with foreground service
Location permission: Always
iOS 14+ target
Any insights on iOS BLE background limitations or best practices would be greatly appreciated.
Thanks!
Selecting any option will automatically load the page