BLE Scanning

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:

  1. Is there a documented maximum duration for iOS background BLE scanning? My scanning stops inconsistently (few minutes to 2 hours).

  2. Does iOS require specific Background Modes beyond location updates to maintain BLE scanning? I have location streaming active but scanning still stops.

  3. Are there undocumented limitations when scanning with service UUIDs in background that might cause termination?

  4. 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!

BLE Scanning
 
 
Q