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.

Erste Schritte mit Firebase Cloud Messaging und Android

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

SDK einrichten

Falls noch nicht geschehen, fügen Sie Ihrem Android-Projekt Firebase hinzu.

Für eine optimale Nutzung von FCM empfehlen wir dringend, Google Analytics in Ihrem Projekt zu aktivieren. Google Analytics ist eine Voraussetzung für die Berichterstellung zur Nachrichtenzustellung von FCM.

App-Manifest bearbeiten

Fügen Sie dem Manifest Ihrer App Folgendes hinzu:

  • Ein Dienst, der FirebaseMessagingService erweitert. Dies ist erforderlich, wenn Sie Nachrichten über das Empfangen von Benachrichtigungen in Apps im Hintergrund hinaus verarbeiten möchten. Wenn Sie Benachrichtigungen in Vordergrund-Apps und Daten-Payloads erhalten möchten, müssen Sie diesen Dienst erweitern.
  • <service
        android:name=".java.MyFirebaseMessagingService"
        android:exported="false">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>
  • (Optional) Metadatenelemente in der Anwendungskomponente zum Festlegen eines Standardbenachrichtigungssymbols und einer Standardbenachrichtigungsfarbe. Android verwendet diese Werte, wenn für eingehende Nachrichten nicht explizit ein Symbol oder eine Farbe festgelegt ist.
  • <!-- Set custom default icon. This is used when no icon is set for incoming notification messages.
         See README(https://goo.gl/l4GJaQ) for more. -->
    <meta-data
        android:name="com.google.firebase.messaging.default_notification_icon"
        android:resource="@drawable/ic_stat_ic_notification" />
    <!-- Set color used with incoming notification messages. This is used when no color is set for the incoming
         notification message. See README(https://goo.gl/6BKBk7) for more. -->
    <meta-data
        android:name="com.google.firebase.messaging.default_notification_color"
        android:resource="@color/colorAccent" />
  • Optional: Ab Android 8.0 (API-Ebene 26) werden Benachrichtigungskanäle unterstützt und empfohlen. FCM bietet einen Standardbenachrichtigungskanal mit grundlegenden Einstellungen. Wenn Sie lieber einen eigenen Standardchannel erstellen und verwenden möchten, legen Sie default_notification_channel_id auf die ID Ihres Benachrichtigungskanalobjekts fest, wie gezeigt. FCM verwendet diesen Wert immer dann, wenn in eingehenden Nachrichten kein Benachrichtigungskanal explizit festgelegt ist. Weitere Informationen finden Sie unter Benachrichtigungskanäle verwalten.
  • <meta-data
        android:name="com.google.firebase.messaging.default_notification_channel_id"
        android:value="@string/default_notification_channel_id" />

Laufzeitberechtigung zum Senden von Benachrichtigungen unter Android 13 und höher anfordern

In Android 13 wird eine neue Laufzeitberechtigung zum Anzeigen von Benachrichtigungen eingeführt. Dies betrifft alle Apps unter Android 13 oder höher, die FCM-Benachrichtigungen verwenden.

Standardmäßig enthält das FCM SDK (Version 23.0.6 oder höher) die im Manifest definierte Berechtigung POST_NOTIFICATIONS. Ihre App muss jedoch auch die Laufzeitversion dieser Berechtigung mit der Konstanten android.permission.POST_NOTIFICATIONS anfordern. Ihre App darf erst dann Benachrichtigungen anzeigen, wenn der Nutzer diese Berechtigung erteilt hat.

So fordern Sie die neue Laufzeitberechtigung an:

Kotlin

// Declare the launcher at the top of your Activity/Fragment:
private val requestPermissionLauncher = registerForActivityResult(
    ActivityResultContracts.RequestPermission(),
) { isGranted: Boolean ->
    if (isGranted) {
        // FCM SDK (and your app) can post notifications.
    } else {
        // TODO: Inform user that that your app will not show notifications.
    }
}

private fun askNotificationPermission() {
    // This is only necessary for API level >= 33 (TIRAMISU)
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) ==
            PackageManager.PERMISSION_GRANTED
        ) {
            // FCM SDK (and your app) can post notifications.
        } else if (shouldShowRequestPermissionRationale(Manifest.permission.POST_NOTIFICATIONS)) {
            // TODO: display an educational UI explaining to the user the features that will be enabled
            //       by them granting the POST_NOTIFICATION permission. This UI should provide the user
            //       "OK" and "No thanks" buttons. If the user selects "OK," directly request the permission.
            //       If the user selects "No thanks," allow the user to continue without notifications.
        } else {
            // Directly ask for the permission
            requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)
        }
    }
}

Java

// Declare the launcher at the top of your Activity/Fragment:
private final ActivityResultLauncher<String> requestPermissionLauncher =
        registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> {
            if (isGranted) {
                // FCM SDK (and your app) can post notifications.
            } else {
                // TODO: Inform user that that your app will not show notifications.
            }
        });

private void askNotificationPermission() {
    // This is only necessary for API level >= 33 (TIRAMISU)
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) ==
                PackageManager.PERMISSION_GRANTED) {
            // FCM SDK (and your app) can post notifications.
        } else if (shouldShowRequestPermissionRationale(Manifest.permission.POST_NOTIFICATIONS)) {
            // TODO: display an educational UI explaining to the user the features that will be enabled
            //       by them granting the POST_NOTIFICATION permission. This UI should provide the user
            //       "OK" and "No thanks" buttons. If the user selects "OK," directly request the permission.
            //       If the user selects "No thanks," allow the user to continue without notifications.
        } else {
            // Directly ask for the permission
            requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS);
        }
    }
}

Im Allgemeinen sollten Sie eine Benutzeroberfläche anzeigen, in der dem Nutzer die Funktionen erläutert werden, die aktiviert werden, wenn er der App die Berechtigung zum Senden von Benachrichtigungen erteilt. Die Benutzeroberfläche sollte dem Nutzer Optionen zum Zustimmen oder Ablehnen bieten, z. B. die Schaltflächen OK und Nein, danke. Wenn der Nutzer OK auswählt, fordern Sie die Berechtigung direkt an. Wenn der Nutzer Nein, danke auswählt, lassen Sie ihn ohne Benachrichtigungen fortfahren.

Weitere Best Practices dazu, wann Ihre App die Berechtigung POST_NOTIFICATIONS vom Nutzer anfordern sollte, finden Sie unter Laufzeitberechtigung für Benachrichtigungen.

Benachrichtigungsberechtigungen für Apps, die auf Android 12L (API-Level 32) oder niedriger ausgerichtet sind

Android fragt den Nutzer automatisch um die Berechtigung, wenn Ihre App zum ersten Mal einen Benachrichtigungskanal erstellt, sofern sich die App im Vordergrund befindet. Es gibt jedoch wichtige Einschränkungen hinsichtlich des Zeitpunkts der Kanalerstellung und der Berechtigungsanfragen:

  • Wenn Ihre App ihren ersten Benachrichtigungschannel erstellt, während sie im Hintergrund ausgeführt wird, was das FCM SDK beim Empfang einer FCM-Benachrichtigung tut, lässt Android nicht zu, dass die Benachrichtigung angezeigt wird. Der Nutzer wird erst beim nächsten Öffnen Ihrer App um die Benachrichtigungsberechtigung gebeten. Das bedeutet, dass alle Benachrichtigungen, die vor dem Öffnen Ihrer App und der Einwilligung des Nutzers in die Berechtigung empfangen werden, verloren gehen.
  • Wir empfehlen dringend, Ihre App so zu aktualisieren, dass sie auf Android 13 oder höher ausgerichtet ist, damit Sie die APIs der Plattform zum Anfordern von Berechtigungen nutzen können. Wenn das nicht möglich ist, sollte Ihre App Benachrichtigungskanäle erstellen, bevor Sie Benachrichtigungen an die App senden, um den Dialog zur Benachrichtigungsberechtigung auszulösen und sicherzustellen, dass keine Benachrichtigungen verloren gehen. Weitere Informationen finden Sie unter Best Practices für Benachrichtigungsberechtigungen.

Optional: Berechtigung für POST_NOTIFICATIONS entfernen

Standardmäßig ist im FCM SDK die Berechtigung POST_NOTIFICATIONS enthalten. Wenn Ihre App keine Benachrichtigungen verwendet (weder über FCM-Benachrichtigungen noch über ein anderes SDK oder direkt von Ihrer App gesendet) und Sie nicht möchten, dass Ihre App die Berechtigung enthält, können Sie sie mit dem remove-Marker des Manifest-Mergers entfernen. Wenn Sie diese Berechtigung entfernen, werden keine Benachrichtigungen mehr angezeigt, nicht nur FCM-Benachrichtigungen. Fügen Sie der Manifestdatei Ihrer App Folgendes hinzu:

<uses-permission android:name="android.permission.POST_NOTIFICATIONS" tools:node="remove"/>

Auf das Geräteregistrierungstoken zugreifen

Beim ersten Start Ihrer App generiert das FCM SDK ein Registrierungstoken für die Client-App-Instanz. Wenn Sie einzelne Geräte als Zielgruppe festlegen oder Gerätegruppen erstellen möchten, müssen Sie auf dieses Token zugreifen, indem Sie FirebaseMessagingService erweitern und onNewToken überschreiben. Da das Token nach dem ersten Start rotiert werden kann, wird dringend empfohlen, das zuletzt aktualisierte Registrierungstoken abzurufen.

Das Registrierungstoken kann sich ändern, wenn:

  • Die App wird auf einem neuen Gerät wiederhergestellt
  • Der Nutzer deinstalliert/installiert die App neu
  • Der Nutzer löscht App-Daten.

Aktuelles Registrierungstoken abrufen

Wenn Sie das aktuelle Token abrufen müssen, rufen Sie FirebaseMessaging.getInstance().getToken() auf:

Kotlin

FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task ->
    if (!task.isSuccessful) {
        Log.w(TAG, "Fetching FCM registration token failed", task.exception)
        return@OnCompleteListener
    }

    // Get new FCM registration token
    val token = task.result

    // Log and toast
    val msg = getString(R.string.msg_token_fmt, token)
    Log.d(TAG, msg)
    Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
})

Java

FirebaseMessaging.getInstance().getToken()
    .addOnCompleteListener(new OnCompleteListener<String>() {
        @Override
        public void onComplete(@NonNull Task<String> task) {
          if (!task.isSuccessful()) {
            Log.w(TAG, "Fetching FCM registration token failed", task.getException());
            return;
          }

          // Get new FCM registration token
          String token = task.getResult();

          // Log and toast
          String msg = getString(R.string.msg_token_fmt, token);
          Log.d(TAG, msg);
          Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
        }
    });

Tokenerstellung überwachen

Der onNewToken-Callback wird immer dann ausgelöst, wenn ein neues Token generiert wird.

Kotlin

/**
 * Called if the FCM registration token is updated. This may occur if the security of
 * the previous token had been compromised. Note that this is called when the
 * FCM registration token is initially generated so this is where you would retrieve the token.
 */
override fun onNewToken(token: String) {
    Log.d(TAG, "Refreshed token: $token")

    // If you want to send messages to this application instance or
    // manage this apps subscriptions on the server side, send the
    // FCM registration token to your app server.
    sendRegistrationToServer(token)
}

Java

/**
 * There are two scenarios when onNewToken is called:
 * 1) When a new token is generated on initial app startup
 * 2) Whenever an existing token is changed
 * Under #2, there are three scenarios when the existing token is changed:
 * A) App is restored to a new device
 * B) User uninstalls/reinstalls the app
 * C) User clears app data
 */
@Override
public void onNewToken(@NonNull String token) {
    Log.d(TAG, "Refreshed token: " + token);

    // If you want to send messages to this application instance or
    // manage this apps subscriptions on the server side, send the
    // FCM registration token to your app server.
    sendRegistrationToServer(token);
}

Nachdem Sie das Token erhalten haben, können Sie es an Ihren App-Server senden und mit der gewünschten Methode speichern.

Prüfen, ob die Google Play-Dienste installiert sind

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.

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 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" />

Wenn Sie die automatische FCM-Initialisierung wieder aktivieren möchten, führen Sie einen Laufzeitaufruf aus:

Kotlin

Firebase.messaging.isAutoInitEnabled = true

Java

FirebaseMessaging.getInstance().setAutoInitEnabled(true);

Wenn Sie die Analytics-Erfassung wieder aktivieren möchten, rufen Sie die Methode setAnalyticsCollectionEnabled() der Klasse FirebaseAnalytics auf. Beispiel:

setAnalyticsCollectionEnabled(true);

Diese Werte bleiben nach dem Festlegen auch nach einem Neustart der App erhalten.

Benachrichtigung senden

So können Sie prüfen, ob Ihr Android-Client richtig eingerichtet ist:

  1. Installieren Sie die App auf dem Zielgerät und führen Sie sie aus.
  2. Die App muss auf dem Gerät im Hintergrund ausgeführt werden.
  3. Öffnen Sie in der Firebase-Konsole die Seite Messaging.
  4. Wenn dies Ihre erste Mitteilung ist, wählen Sie Erste Kampagne erstellen, 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. Alle anderen sind optional.
  7. Wählen Sie im rechten Bereich Testnachricht senden aus.
  8. Geben Sie in das Feld mit der Bezeichnung FCM-Registrierungstoken hinzufügen das Registrierungstoken ein, das Sie in einem vorherigen Abschnitt dieses Leitfadens erhalten haben.
  9. Wählen Sie Testen aus.

Das Zielclientgerät mit der App im Hintergrund sollte die Benachrichtigung empfangen.

Weitere Informationen zur Zustellung von Nachrichten an Ihre App finden Sie im FCM-Berichtsdashboard. Dort wird die Anzahl der gesendeten und geöffneten Nachrichten auf Apple- und Android-Geräten sowie Daten zu Impressionen (von Nutzern gesehene Benachrichtigungen) für Android-Apps erfasst.

Nächste Schritte

Nachdem die Client-App eingerichtet ist, können Sie Nachrichten empfangen oder an Ihre Nutzer senden: