Erste Schritte mit Firebase Cloud Messaging


In dieser Kurzanleitung wird beschrieben, wie Sie Firebase Cloud Messaging in Ihren mobilen Client-Apps und Webclient-Apps einrichten, damit Sie zuverlässig Nachrichten senden können. Informationen zu Serverumgebungen finden Sie unter Ihre Serverumgebung und FCM.

Firebase Cloud Messaging-Client-App in Flutter einrichten

Je nach Zielplattform sind einige zusätzliche Einrichtungsschritte erforderlich.

iOS+

Method Swizzling

Wenn Sie das FCM-Flutter-Plug-in auf Apple-Geräten verwenden möchten, ist Method Swizzling erforderlich. Ohne sie funktionieren wichtige Firebase-Funktionen wie die FCM-Token-Verarbeitung nicht richtig.

Android

Google Play-Dienste

Für FCM-Clients sind Geräte mit Android 4.4 oder höher erforderlich, auf denen auch Google Play-Dienste installiert sind, oder ein Emulator mit Android 4.4 und Google APIs. Sie können Ihre Android-Apps auch über andere Plattformen als den Google Play Store bereitstellen.

Apps, die auf dem Play Services SDK basieren, sollten immer prüfen, ob auf dem Gerät ein kompatibles APK für die Google Play-Dienste vorhanden ist, bevor sie auf Funktionen der Google Play-Dienste zugreifen. Es wird empfohlen, 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. Durch die Prüfung in onResume() wird sichergestellt, dass die Prüfung auch dann durchgeführt wird, wenn der Nutzer auf andere Weise zur laufenden App zurückkehrt, z. B. über die Zurück-Schaltfläche.

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

Web

Webanmeldedaten mit FCM konfigurieren

Die FCM-Weboberfläche verwendet Webanmeldedaten namens „Voluntary Application Server Identification“ oder „VAPID“-Schlüssel, um Sendeanfragen an unterstützte Web-Push-Dienste zu autorisieren. Wenn Sie Ihre App für Push-Benachrichtigungen registrieren 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.

FCM-Plug-in 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 Ihre Flutter-Anwendung neu:

    flutter run
    

Auf das Registrierungstoken zugreifen

Wenn Sie eine Nachricht an ein bestimmtes Gerät senden möchten, benötigen Sie das Geräteregistrierungstoken. Rufen Sie getToken() auf, um das Registrierungstoken für eine App-Instanz abzurufen. Wenn die Berechtigung zum Senden von Benachrichtigungen nicht erteilt wurde, wird der Nutzer mit dieser Methode aufgefordert, die Berechtigung zu erteilen. Andernfalls wird ein Token zurückgegeben oder das Future wird 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, wenn das Token aktualisiert wird, abonnieren Sie den onTokenRefresh-Stream:

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 Generierung von Tokens verhindern möchten, deaktivieren Sie die automatische Initialisierung zur Build-Zeit.

iOS

Fügen Sie unter iOS einen Metadatenwert zu Ihrem Info.plist hinzu:

FirebaseMessagingAutoInitEnabled = NO

Android

Deaktivieren Sie auf Android die Analytics-Erfassung und die automatische FCM-Initialisierung (Sie müssen beides deaktivieren), indem Sie diese Metadatenwerte zu Ihrem AndroidManifest.xml 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-Auto-Init 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 auch nach dem Neustart der App erhalten.

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 für die Berechtigung zum Empfangen von Remote-Benachrichtigungen annehmen.
  2. Die App muss auf dem Gerät im Hintergrund ausgeführt werden.
  3. Öffnen Sie in der Firebase Console die Seite „Messaging“.
  4. Wenn dies Ihre erste Mitteilung 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 FCM-Registrierungstoken hinzufügen Ihr Registrierungstoken ein.
  9. Wählen Sie Testen aus.

Nachdem Sie Testen ausgewählt haben, sollte das Zielclientgerät die Benachrichtigung erhalten, während die App im Hintergrund ausgeführt wird.

Im FCM-Berichtsdashboard finden Sie Informationen zur Zustellung von Nachrichten an Ihre App. Dort wird die Anzahl der Nachrichten erfasst, die auf Apple- und Android-Geräten gesendet und geöffnet wurden. Außerdem sind Impressionen für Android-Apps verfügbar.

Umgang mit Interaktionen

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

Je nach Inhalt einer Benachrichtigung müssen 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 firebase-messaging-Paket bietet zwei Möglichkeiten, diese Interaktion zu verarbeiten:

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

Damit Nutzer ein reibungsloses Erlebnis haben, sollten Sie beide Szenarien berücksichtigen. Das folgende Codebeispiel zeigt, 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 mit der Interaktion umgehen, hängt von Ihrer Einrichtung ab. Das oben 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: