Erste Schritte mit Firebase Cloud Messaging in Flutter-Apps

Plattform auswählen : iOS+ Android Web Flutter Unity C++


In diesem Leitfaden wird beschrieben, wie Sie Firebase Cloud Messaging in Ihren Flutter-Client-Apps verwenden können, um zuverlässig Nachrichten zu senden.

Je nach Zielplattform sind einige zusätzliche Einrichtungsschritte erforderlich.

iOS+

Method Swizzling

Um das FCM Flutter-Plug-in auf Apple-Geräten zu verwenden, ist Method Swizzling erforderlich. Andernfalls funktionieren wichtige Firebase-Funktionen wie die FCM Tokenverwaltung nicht richtig.

Android

Google Play-Dienste

FCM Clients erfordern Geräte mit Android 4.4 oder höher, auf denen auch die Google Play-Dienste installiert sind, oder einen Emulator mit Android 4.4 und Google APIs. Sie sind nicht darauf beschränkt, Ihre Android-Apps über den Google Play Store bereitzustellen.

Apps, die auf dem Play Services SDK basieren, sollten immer prüfen, ob auf dem Gerät ein kompatibles Google Play-Dienste-APK vorhanden ist, bevor sie auf Google Play-Dienste-Funktionen zugreifen. Wir empfehlen, dies an zwei Stellen zu tun: in der Methode onCreate() der Hauptaktivität und in der Methode onResume(). Die Prüfung in onCreate() sorgt dafür, dass die App nicht ohne erfolgreiche Prüfung verwendet werden kann. Die Prüfung in onResume() sorgt dafür, dass die Prüfung auch dann durchgeführt wird, wenn der Nutzer auf andere Weise zur laufenden App zurückkehrt, z. B. über die Schaltfläche „Zurück“.

Wenn auf dem Gerät keine kompatible Version der Google Play-Dienste vorhanden ist, kann Ihre App GoogleApiAvailability.makeGooglePlayServicesAvailable() aufrufen, damit Nutzer die Google Play-Dienste aus dem Play Store herunterladen können.

Web

Web-Anmeldedaten mit FCM konfigurieren

Die FCM Weboberfläche verwendet Web-Anmeldedaten, sogenannte VAPID-Schlüssel (Voluntary Application Server Identification), um Sendeanfragen an unterstützte Web-Push-Dienste zu autorisieren. Wenn Sie Ihre App für Push-Benachrichtigungen abonnieren möchten, müssen Sie ein Schlüsselpaar mit Ihrem Firebase-Projekt verknüpfen. Sie können entweder ein neues Schlüsselpaar generieren oder Ihr vorhandenes Schlüsselpaar über die Firebase Konsole importieren.

Plug-in FCM installieren

  1. Installieren und initialisieren Sie die Firebase-Plug-ins für Flutter falls noch nicht geschehen.

  2. Führen Sie im Stammverzeichnis Ihres Flutter-Projekts den folgenden Befehl aus, um das Plug-in zu installieren:

    flutter pub add firebase_messaging
    
  3. Erstellen Sie nach Abschluss der Installation Ihre Flutter-Anwendung neu:

    flutter run
    

Registrierungstoken aufrufen

Wenn Sie eine Nachricht an ein bestimmtes Gerät senden möchten, benötigen Sie das Registrierungstoken des Geräts. Rufen Sie getToken() auf, um das Registrierungstoken für eine App-Instanz abzurufen. Wenn keine Berechtigung für Benachrichtigungen erteilt wurde, werden Nutzer mit dieser Methode um die Berechtigung für Benachrichtigungen gebeten. Andernfalls wird ein Token zurückgegeben oder die zukünftige Ausführung aufgrund eines Fehlers abgelehnt.

// You may set the permission requests to "provisional" which allows the user to choose what type
// of notifications they would like to receive once the user receives a notification.
final notificationSettings = await FirebaseMessaging.instance.requestPermission(provisional: true);

// For apple platforms, make sure the APNS token is available before making any FCM plugin API calls
final apnsToken = await FirebaseMessaging.instance.getAPNSToken();
if (apnsToken != null) {
 // APNS token is available, make FCM plugin API requests...
}

Übergeben Sie auf Webplattformen Ihren öffentlichen VAPID-Schlüssel an getToken():

final fcmToken = await FirebaseMessaging.instance.getToken(vapidKey: "BKagOny0KF_2pCJQ3m....moL0ewzQ8rZu");

Wenn Sie benachrichtigt werden möchten, sobald das Token aktualisiert wird, abonnieren Sie den Stream onTokenRefresh:

FirebaseMessaging.instance.onTokenRefresh
    .listen((fcmToken) {
      // TODO: If necessary send token to application server.

      // Note: This callback is fired at each app startup and whenever a new
      // token is generated.
    })
    .onError((err) {
      // Error getting token.
    });

Automatische Initialisierung verhindern

Wenn ein FCM Registrierungstoken generiert wird, lädt die Bibliothek die Kennung und die Konfigurationsdaten in Firebase hoch. Wenn Sie die automatische Tokengenerierung verhindern möchten, deaktivieren Sie die automatische Initialisierung zur Build-Zeit.

iOS

Fügen Sie unter iOS einen Metadatenwert zu Ihrer Info.plist-Datei hinzu:

FirebaseMessagingAutoInitEnabled = NO

Android

Deaktivieren Sie unter Android die Analytics-Erfassung und die automatische FCM-Initialisierung (beide müssen deaktiviert werden), indem Sie diese Metadatenwerte zu Ihrer AndroidManifest.xml-Datei hinzufügen:

<meta-data
    android:name="firebase_messaging_auto_init_enabled"
    android:value="false" />
<meta-data
    android:name="firebase_analytics_collection_enabled"
    android:value="false" />

FCM automatische Initialisierung zur Laufzeit wieder aktivieren

Rufen Sie setAutoInitEnabled() auf, um die automatische Initialisierung für eine bestimmte App-Instanz zu aktivieren:

await FirebaseMessaging.instance.setAutoInitEnabled(true);

Dieser Wert bleibt nach dem Festlegen bei App-Neustarts bestehen.

Testbenachrichtigung senden

  1. Installieren Sie die App auf dem Zielgerät und führen Sie sie aus. Auf Apple-Geräten müssen Sie die Anfrage zur Berechtigung für den Empfang von Remote-Benachrichtigungen akzeptieren.
  2. Achten Sie darauf, dass die App auf dem Gerät im Hintergrund ausgeführt wird.
  3. Öffnen Sie in der Firebase Console die Seite „Messaging“.
  4. Wenn dies Ihre erste Nachricht ist, wählen Sie Erste Kampagne erstellen aus.
    1. Wählen Sie Firebase-Benachrichtigungen und dann Erstellen aus.
  5. Wählen Sie andernfalls auf dem Tab Kampagnen die Option Neue Kampagne und dann Benachrichtigungen aus.
  6. Geben Sie den Nachrichtentext ein.
  7. Wählen Sie im rechten Bereich Testnachricht senden aus.
  8. Geben Sie im Feld Registrierungstoken hinzufügen Ihr Registrierungstoken ein.FCM
  9. Wählen Sie Testen aus.

Nachdem Sie Testen ausgewählt haben, sollte das Zielgerät mit der App im Hintergrund die Benachrichtigung erhalten.

Auf dem FCM Reporting Dashboard finden Sie Informationen zur Zustellung von Nachrichten an Ihre App. Dort wird die Anzahl der gesendeten und geöffneten Nachrichten auf Apple- und Android-Geräten sowie Impressionen für Android-Apps erfasst.

Interaktion verarbeiten

Wenn Nutzer auf eine Benachrichtigung tippen, wird die Anwendung standardmäßig sowohl unter Android als auch unter iOS geöffnet. Wenn die Anwendung beendet wurde, wird sie gestartet. Wenn sie im Hintergrund ausgeführt wird, wird sie in den Vordergrund gebracht.

Je nach Inhalt einer Benachrichtigung möchten Sie möglicherweise die Interaktion des Nutzers verarbeiten, wenn die Anwendung geöffnet wird. Wenn beispielsweise eine neue Chatnachricht über eine Benachrichtigung gesendet wird und der Nutzer sie auswählt, möchten Sie möglicherweise die entsprechende Unterhaltung öffnen, wenn die Anwendung geöffnet wird.

Das Paket firebase-messaging bietet zwei Möglichkeiten, diese Interaktion zu verarbeiten:

  1. getInitialMessage(): Wenn die Anwendung aus einem beendeten Zustand geöffnet wird, gibt diese Methode ein Future mit einer RemoteMessage zurück. Nach der Verwendung wird die RemoteMessage entfernt.
  2. onMessageOpenedApp: EinStream der eine RemoteMessage postet, wenn die Anwendung aus dem Hintergrund geöffnet wird.

Damit Ihre Nutzer ein reibungsloses Erlebnis haben, sollten Sie beide Szenarien verarbeiten. Im folgenden Codebeispiel wird gezeigt, wie das geht:

class Application extends StatefulWidget {
  @override
  State createState() => _Application();
}

class _Application extends State {
  // In this example, suppose that all messages contain a data field with the key 'type'.
  Future setupInteractedMessage() async {
    // Get any messages which caused the application to open from
    // a terminated state.
    RemoteMessage? initialMessage =
        await FirebaseMessaging.instance.getInitialMessage();

    // If the message also contains a data property with a "type" of "chat",
    // navigate to a chat screen
    if (initialMessage != null) {
      _handleMessage(initialMessage);
    }

    // Also handle any interaction when the app is in the background using a
    // Stream listener
    FirebaseMessaging.onMessageOpenedApp.listen(_handleMessage);
  }

  void _handleMessage(RemoteMessage message) {
    if (message.data['type'] == 'chat') {
      Navigator.pushNamed(context, '/chat',
        arguments: ChatArguments(message),
      );
    }
  }

  @override
  void initState() {
    super.initState();

    // Run code required to handle interacted messages in an async function
    // as initState() must not be async
    setupInteractedMessage();
  }

  @override
  Widget build(BuildContext context) {
    return Text("...");
  }
}

Wie Sie die Interaktion verarbeiten, hängt von Ihrer Einrichtung ab. Das zuvor gezeigte Beispiel ist ein einfaches Beispiel für die Verwendung eines StatefulWidget.

Nächste Schritte

Nachdem Sie die Einrichtungsschritte abgeschlossen haben, haben Sie folgende Möglichkeiten, mit FCM für Flutter fortzufahren: