feat(messaging): FCM-Integration – Foreground Service ersetzen #124

Open
opened 2026-05-18 19:59:34 +00:00 by jreinemann-euris · 0 comments
jreinemann-euris commented 2026-05-18 19:59:34 +00:00 (Migrated from github.com)

## Ziel

Den Foreground-Service-Workaround (persistente „Warten auf Nachrichten"-Notification) durch Firebase Cloud Messaging (FCM) ersetzen. Nach dieser Migration benötigt die App keinen eigenen persistenten Hintergrunddienst mehr – Google Play Services hält die Verbindung zu FCM und weckt die App bei eingehenden Nachrichten.

Hintergrund

WhatsApp, Signal und Telegram verwenden alle FCM statt eigener WebSocket-Verbindungen im Hintergrund:

Neue Nachricht auf Server
        ↓
Server sendet FCM High-Priority Data Message
        ↓
Google Play Services empfängt (hält eigene Verbindung)
        ↓
Weckt App via FirebaseMessagingService.onMessageReceived()
        ↓
App zeigt Notification an → kein Foreground Service nötig

Aufgaben

Server-Seite

  • Firebase Admin SDK einbinden (firebase-admin)
  • FCM HTTP v1 API Endpoint: POST /api/fcm/register – FCM-Token pro User + Device speichern
  • Bei neuer Nachricht: FCM High-Priority Data Message an alle Geräte des Empfängers senden
  • FCM-Token in DB (User-Tabelle oder eigene Device-Tokens-Tabelle)

App-Seite

  • google-services.json aus Firebase Console herunterladen und einbinden
  • FCM-Dependency in build.gradle.kts: com.google.firebase:firebase-messaging
  • FirebaseMessagingService implementieren (onMessageReceived, onNewToken)
  • FCM-Token beim Login/Start an Server schicken
  • MessagingService (Foreground Service) entfernen
  • Nur Data Messages (kein notification-Feld) → App zeigt selbst Notification

FCM Payload (Server, High Priority)

{
  "message": {
    "token": "<device-fcm-token>",
    "data": {
      "type": "new_message",
      "senderId": "...",
      "senderUsername": "..."
    },
    "android": { "priority": "high" }
  }
}

Besonderheiten / Risiken

  • Doze Mode: High-Priority FCM-Messages werden auch im Doze-Mode zugestellt
  • Deprioritization: FCM kann High-Priority zu Normal degradieren wenn keine Notification angezeigt wird → immer Notification zeigen
  • Token-Refresh: onNewToken muss neuen Token an Server übermitteln
  • Fallback: Wenn FCM nicht verfügbar (kein Google Play), WebSocket-Fallback beibehalten
  • Privacy: FCM-Payload enthält keine Nachrichteninhalte (nur Sender-ID) → E2EE bleibt gewahrt

Abnahmekriterien

  • App im Hintergrund (Doze-Mode) empfängt Nachrichten innerhalb von ~5 Sekunden
  • Keine „Warten auf Nachrichten"-Notification mehr sichtbar
  • MessagingService Foreground Service ist entfernt
## Ziel Den Foreground-Service-Workaround (persistente „Warten auf Nachrichten"-Notification) durch Firebase Cloud Messaging (FCM) ersetzen. Nach dieser Migration benötigt die App keinen eigenen persistenten Hintergrunddienst mehr – Google Play Services hält die Verbindung zu FCM und weckt die App bei eingehenden Nachrichten. ## Hintergrund WhatsApp, Signal und Telegram verwenden alle FCM statt eigener WebSocket-Verbindungen im Hintergrund: ``` Neue Nachricht auf Server ↓ Server sendet FCM High-Priority Data Message ↓ Google Play Services empfängt (hält eigene Verbindung) ↓ Weckt App via FirebaseMessagingService.onMessageReceived() ↓ App zeigt Notification an → kein Foreground Service nötig ``` ## Aufgaben ### Server-Seite - [ ] Firebase Admin SDK einbinden (`firebase-admin`) - [ ] FCM HTTP v1 API Endpoint: `POST /api/fcm/register` – FCM-Token pro User + Device speichern - [ ] Bei neuer Nachricht: FCM High-Priority Data Message an alle Geräte des Empfängers senden - [ ] FCM-Token in DB (User-Tabelle oder eigene Device-Tokens-Tabelle) ### App-Seite - [ ] `google-services.json` aus Firebase Console herunterladen und einbinden - [ ] FCM-Dependency in `build.gradle.kts`: `com.google.firebase:firebase-messaging` - [ ] `FirebaseMessagingService` implementieren (`onMessageReceived`, `onNewToken`) - [ ] FCM-Token beim Login/Start an Server schicken - [ ] `MessagingService` (Foreground Service) entfernen - [ ] Nur **Data Messages** (kein `notification`-Feld) → App zeigt selbst Notification ### FCM Payload (Server, High Priority) ```json { "message": { "token": "<device-fcm-token>", "data": { "type": "new_message", "senderId": "...", "senderUsername": "..." }, "android": { "priority": "high" } } } ``` ## Besonderheiten / Risiken - **Doze Mode**: High-Priority FCM-Messages werden auch im Doze-Mode zugestellt - **Deprioritization**: FCM kann High-Priority zu Normal degradieren wenn keine Notification angezeigt wird → immer Notification zeigen - **Token-Refresh**: `onNewToken` muss neuen Token an Server übermitteln - **Fallback**: Wenn FCM nicht verfügbar (kein Google Play), WebSocket-Fallback beibehalten - **Privacy**: FCM-Payload enthält keine Nachrichteninhalte (nur Sender-ID) → E2EE bleibt gewahrt ## Abnahmekriterien - App im Hintergrund (Doze-Mode) empfängt Nachrichten innerhalb von ~5 Sekunden - Keine „Warten auf Nachrichten"-Notification mehr sichtbar - `MessagingService` Foreground Service ist entfernt
bollwerkadmin added the
status:backlog
label 2026-05-19 20:37:22 +00:00
Sign in to join this conversation.
No description provided.