P0Connectivity

iOS kills background BLE within minutes

Problem

iOS aggressively suspends background BLE. A ring or watch connected at lock time is likely disconnected within 5–15 minutes.

Why it happens

iOS reclaims CPU and radio from non-foreground apps. The connection token may persist while the app process is frozen — buffered notifications may or may not survive.

Saola's solution
  • 01Per-source persisted sync cursor (last successful timestamp / record ID) on device + backend.
  • 02On every sync opportunity, request only the delta since the cursor.
  • 03Cursor advances only after atomic write to the ingest log.
  • 04Multi-trigger orchestration: bluetooth-central, background-fetch (~15 min), silent push.
  • 05UI never blocks on sync — render from local canonical cache, refresh optimistically.
Trade-off · Cursor logic adds adapter complexity and demands strict idempotency. A missed background window is never catastrophic — the next sync resumes.
Where in v3 · Stage 1 — incremental_pull(since_cursor); per-source sync-state table.