Zum Hauptinhalt springen

Web-Push-Benachrichtigungen

ChurchApps Web-Apps liefern Push-Benachrichtigungen über die W3C Web Push API -- der gleiche Mechanismus, der von Firebase Cloud Messaging auf der Server-Seite verwendet wird, aber über den PushManager des Browsers statt FCM geliefert.

When push fires

Die MessagingApi liefert eine Web-Push-Nachricht in drei Situationen:

  1. Gruppen-/Inhaltsbenachrichtigungen -- jemand antwortet auf einen Thread, dem der Benutzer folgt
  2. Private Nachrichten -- POST /messaging/privatemessages triggert einen Push an die eingeschriebenen Geräte des Empfängers
  3. Generische Benachrichtigungen -- direkte Aufrufe zu POST /messaging/notifications/create

Push ist die Notfallebene in NotificationHelper's Eskalationsleiter.

Server flow

NotificationHelper.checkShouldNotify(...)

├─ in-page socket delivery ← preferred

└─ NotificationHelper.<sendXxx>(...)
└─ WebPushHelper.sendBulkTypedMessages(...)
└─ web-push library → VAPID-signed POST

Required environment variables

VAPID-Schlüssel müssen vorhanden sein, damit der Push aktiviert ist:

VariableDescription
webPushPublicKeyVAPID-Öffentlicher Schlüssel
webPushPrivateKeyVAPID-Privater Schlüssel
webPushSubjectmailto: URI

Generating a VAPID key pair

npx web-push generate-vapid-keys

Storage model

Web-Push-Abonnements werden in der vorhandenen devices-Tabelle gespeichert.

Endpoints

Base path: /messaging/webpush

MethodPathAuthDescription
GET/publicKeyPublicGibt { publicKey, enabled } zurück
POST/subscribeJWTRegistriert ein Abonnement
POST/unsubscribePublicLöscht ein Geräte-Zeile
DELETE/subscription/:idJWTLöscht eine spezifische Geräte-Zeile

Client primitive: WebPushHelper

@churchapps/apphelper's WebPushHelper ist der einzige Client-seitige Entry Point.

Service worker requirement

Der Browser's PushManager benötigt einen registrierten Service Worker.

Operational notes

  • Eine gone: true-Antwort bedeutet, die Subscription ist permanent ungültig
  • TTL: Push-Nachrichten werden mit TTL: 86400 (24 Stunden) gesendet
  • Keine Wiederholungen: Ein transienter Fehler wird protokolliert und nicht wiederholt
  • Deaktivierte Umgebungen: Staging- und Dev-Umgebungen können die VAPID-Schlüssel leer lassen