Flutter Push-Benachrichtigungen mit Supabase und Entrig

Entrig
Ib Entrig Team

Flutter Push-Benachrichtigungen mit Supabase und Entrig

In dieser Anleitung fügen wir einer Flutter-App mit Supabase und Entrig Push-Benachrichtigungen hinzu.

Entrig ist ein Tool für Supabase, das auf Datenbankereignisse reagiert und Push-Benachrichtigungen ohne Backend-Code versendet. Wir bauen einen Gruppenchat nach; die Beispiel-App auf GitHub kannst du parallel verwenden.

Voraussetzungen

  • Ein Supabase-Konto mit Projekt
  • Ein Entrig-Konto auf entrig.com
  • Firebase-Service-Account-JSON für Android
  • APNs-Authentifizierungsschlüssel und Apple-Developer-Konto für iOS

Einrichtung

1. Paket installieren

Füge Entrig in pubspec.yaml ein und installiere es mit flutter pub get:

dependencies:
  entrig: ^latest_version

2. Plattformen konfigurieren

Android: Es ist keine zusätzliche Einrichtung erforderlich.

iOS: Der folgende Befehl richtet die Capabilities automatisch ein:

flutter pub run entrig:setup

Er aktualisiert AppDelegate, Runner.entitlements und Info.plist und legt Sicherungskopien an.

3. In der App initialisieren

Hole den API-Schlüssel aus den Entrig-Dashboard-Einstellungen und füge ihn zu main.dart hinzu:

await Entrig.init(apiKey: 'YOUR_ENTRIG_API_KEY');

4. Benutzer registrieren

Registriere beim Anmelden das Gerät mit einer Benutzer-ID — normalerweise der ID von Supabase Auth:

final user = Supabase.instance.client.auth.currentUser;
if (user != null) {
  await Entrig.registerUser(userId: user.id);
}

Eine eigene Benutzer-ID ist ebenfalls möglich, wenn sie mit der ID in der Tabelle users übereinstimmt. Entrig ordnet damit Geräte Datenbankzeilen zu. Beim Abmelden wird das Gerät entfernt:

await Entrig.unregisterUser();

Weitere Details enthält die Flutter-SDK-Dokumentation.

Datenbank der App

Das Schema ist ein einfacher Gruppenchat: Nutzer erstellen Gruppen, treten ihnen bei und senden Nachrichten.

group_members
group_id
uuid
user_id
uuid
created_at
timestamptz
groups
id
uuid
created_at
timestamptz
name
text
created_by
uuid
users
id
uuid
created_at
timestamptz
name
text
messages
id
uuid
created_at
timestamptz
content
text
user_id
uuid
group_id
uuid

users ist der Ausgangspunkt. groups.created_by bezeichnet den Besitzer, group_members verbindet Nutzer und Gruppen, und messages speichert Inhalt, Gruppe und Absender.

Die Benachrichtigungen verwenden drei Beziehungen:

  1. Mitglied tritt bei → group_members → groups → created_by zum Besitzer (eins zu eins).
  2. Neue Nachricht → über group_members an alle Mitglieder außer dem Absender (eins zu vielen).
  3. Neue Gruppe → an alle registrierten Nutzer außer dem Ersteller (Broadcast).

Direkt, indirekt über eine Join-Tabelle und Broadcast decken damit die meisten Benachrichtigungsfälle ab.

Benachrichtigungen erstellen

Eine Entrig-Benachrichtigung besteht aus Trigger (Datenbankereignis), Users (Empfänger) und Message (Text).

Direkt: Ein Mitglied tritt bei

Die neue Zeile in group_members enthält die user_id des neuen Mitglieds und die group_id, jedoch nicht die Besitzer-ID. Entrig folgt der Fremdschlüsselkette group_id → groups → created_by → users.id. Das ist Direct: ein Ereignis, ein Empfänger. Eine Bedingung schließt das automatische Hinzufügen aus, das beim Erstellen einer eigenen Gruppe erfolgt.

  • Tabelle / Ereignis: group_members / INSERT
  • Bedingung: group_members.user_id ≠ groups.created_by
  • Pfad: group_members.group_id → groups → created_by → users.id
  • Typ: new_member; Felder: groups.name, users.name, group_members.group_id

Indirekt über Join-Tabelle: Neue Nachricht

Bei einer Nachricht sollen alle Gruppenmitglieder außer dem Absender benachrichtigt werden. Das Insert liegt in messages, die Empfänger aber in group_members. Entrig nimmt die group_id, sucht passende Mitgliedszeilen und löst jede user_id zu einem registrierten Gerät auf.

  • Tabelle / Ereignis: messages / INSERT
  • Verbindung: Indirect via Join Table
  • Pfad: messages.group_id → group_members → user_id → users.id
  • Empfängerfilter: group_members.user_id ≠ messages.user_id
  • Typ: new_message; Felder: messages.content, users.name, messages.group_id, groups.name

Broadcast: Neue Gruppe

Bei einer neuen Gruppe kann Entrig alle Nutzer in users informieren. Eine Join-Tabelle ist nicht nötig: Das ist Broadcast. Filtere den Ersteller heraus, weil er seine eigene Gruppe bereits kennt.

  • Tabelle / Ereignis: groups / INSERT
  • Verbindung: Broadcast (alle Nutzer aus users)
  • Filter: users.id ≠ groups.created_by
  • Typ: new_group; Felder: groups.id, groups.name, users.name

Entrig generiert nach dem Anlegen einer Benachrichtigung automatisch Datenbank-Trigger und -Funktion im Supabase-Projekt. Manuelles Deployment ist nicht erforderlich.

Benachrichtigungen im SDK verarbeiten

Alle drei Benachrichtigungen enthalten eine Gruppen-ID. Mit event.type leitest du Nutzer zum richtigen Bildschirm:

Entrig.onNotificationOpened.listen((NotificationEvent event) {
  switch (event.type) {
    case 'new_member':
      // Dialog anzeigen und Chat event.data['group_id'] öffnen
      break;
    case 'new_message':
      // Chat event.data['group_id'] direkt öffnen
      break;
    case 'new_group':
      // Dialog anzeigen und neue Gruppe event.data['id'] öffnen
      break;
  }
});

event.type entspricht dem im Dashboard festgelegten Wert. event.data enthält die ausgewählten IDs, Namen und Nachrichteninhalte.

Fazit

Direct, Indirect und Broadcast entsprechen den drei grundlegenden Arten, wie Empfänger in einer relationalen Datenbank mit einem Ereignis verknüpft sind. Ist das passende Muster klar, bleibt nur Konfiguration. Dasselbe Prinzip gilt für Bestellungen, Aufgaben und Produktankündigungen.

Siehe die vollständige Flutter-SDK-Referenz und den englischen Überblick Push Notifications for Supabase.