Decision guide
Polling vs Push vs Persistent Connections for Mobile
How should a mobile app learn about server-side changes?
Side by side
| Criterion | Periodic polling / sync on foreground | Push notifications (APNs/FCM) | Persistent connection (WebSocket/SSE) |
|---|---|---|---|
| Latency | Interval / on open | Seconds (best effort) | Sub-second |
| Works in background | Only via OS-scheduled tasks | Yes (visible) / throttled (silent) | No (except special cases like VoIP) |
| Battery & data cost | Depends on interval | Low | Medium–high while connected |
| Delivery guarantee | Yes when it runs | No | While connected; resync after reconnect |
| Server cost | Request volume | Push provider calls, token hygiene | Connection fan-out infrastructure |
| User permission | None | Required for visible notifications | None |
When to choose each
Periodic polling / sync on foreground
App fetches changes on launch, on foreground and occasionally while open.
Choose when
- Data that changes rarely
- Guaranteed freshness when the user opens the app
Avoid when
- Time-sensitive updates while the app is backgrounded
Push notifications (APNs/FCM)
Platform push wakes the user or app; payload is a hint or a short message.
Choose when
- Messages and alerts users must see
- Background 'sync now' hints
Avoid when
- Delivery guarantees or large payloads
- High-frequency updates (throttled)
Persistent connection (WebSocket/SSE)
Open socket while the app is in the foreground.
Choose when
- Chat, live tracking, collaboration on screen
- Sub-second updates
Avoid when
- Background updates (OS suspends sockets)
- Battery-sensitive idle screens
Verdict
Combine them: sync on foreground for correctness, push for timely background awareness (as hints, never as the source of truth), and persistent connections only for screens that need live updates while open. Always design a resync path because push and sockets both drop messages.
Learn more
- Mobile API Best Practices
- Real-Time APIs
- API Design
- Performance & Scalability
- Stream responses with Server-Sent Events (FastAPI)
- Poll a long-running job's status (React)
- Show live updates over WebSockets (React)