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
AppLifecycleStateobserver
// 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!