Nachrichten mit Firebase Cloud Messaging empfangen

In diesem Leitfaden wird beschrieben, wie Sie Firebase Cloud Messaging in Ihren mobilen und Webclient-Apps einrichten, damit Sie Nachrichten zuverlässig empfangen können.

Wenn Sie Nachrichten empfangen möchten, können Sie einen Dienst verwenden, der FirebaseMessagingService erweitert. Ihr Dienst sollte die Callbacks onMessageReceived und onDeletedMessages überschreiben. Ein vollständiges Beispiel finden Sie im Firebase Cloud Messaging-Kurzanleitungsbeispiel.

onMessageReceived ist für die meisten Nachrichtentypen verfügbar, mit den folgenden Ausnahmen:

  • Benachrichtigungen, die zugestellt werden, wenn Ihre App im Hintergrund ausgeführt wird: In diesem Fall wird die Benachrichtigung in der Taskleiste des Geräts angezeigt. Wenn ein Nutzer auf eine Benachrichtigung tippt, wird standardmäßig der App Launcher geöffnet.

  • Nachrichten mit Benachrichtigungs- und Daten-Payload, wenn sie im Hintergrund empfangen werden. In diesem Fall wird die Benachrichtigung in der Taskleiste des Geräts angezeigt und die Daten-Payload wird in den Extras des Intents Ihrer Launcher-Aktivität bereitgestellt.

Zusammenfassung:

App-Status Benachrichtigung Daten Beides
Vordergrund onMessageReceived onMessageReceived onMessageReceived
Hintergrund Taskleiste onMessageReceived Benachrichtigung: Taskleiste Daten: in Extras des Intents.

Weitere Informationen zu Nachrichtentypen finden Sie unter Benachrichtigungen und Datenmeldungen.

Der onMessageReceived-Callback hat ein kurzes Ausführungsfenster. Viele Faktoren können sich auf die Dauer dieses Zeitfensters auswirken, darunter Verzögerungen des Betriebssystems, die Startzeit der App, der Haupt-Thread, der durch andere Vorgänge blockiert wird, oder vorherige onMessageReceived-Aufrufe, die zu lange dauern.

Aus diesem Grund sollten Sie in onMessageReceived keine zeitaufwendigen Aufgaben ausführen, z. B. das Abrufen von Bildern von einem Server, die in einer Benachrichtigung angezeigt werden sollen. Planen Sie stattdessen eine Aufgabe mit WorkManager, um alle Aufgaben zu verarbeiten, deren Ausführung länger als ein paar Sekunden dauern könnte. Weitere Informationen zur Nachrichtenpriorität und dazu, wie sie sich auf die Verarbeitung auswirkt, finden Sie unter Nachrichtenverarbeitung für Nachrichten mit hoher und normaler Priorität.

App-Manifest bearbeiten

Wenn Sie FirebaseMessagingService verwenden möchten, müssen Sie Folgendes in das App-Manifest einfügen:

<service
    android:name=".java.MyFirebaseMessagingService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>

Es wird empfohlen, Standardwerte festzulegen, um das Erscheinungsbild von Benachrichtigungen anzupassen. Sie können ein benutzerdefiniertes Standardsymbol und eine benutzerdefinierte Standardfarbe angeben, die angewendet werden, wenn in der Benachrichtigungs-Payload keine entsprechenden Werte festgelegt sind.

Fügen Sie diese Zeilen in das application-Tag ein, um das benutzerdefinierte Standardsymbol und die benutzerdefinierte Farbe festzulegen:

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

Android zeigt das benutzerdefinierte Standardsymbol an und verwendet es für

  • Alle Benachrichtigungen, die über den Benachrichtigungs-Composer gesendet werden.
  • Alle Benachrichtigungen, bei denen das Symbol nicht explizit in der Benachrichtigungs-Payload festgelegt ist.

Wenn kein benutzerdefiniertes Standardsymbol festgelegt ist und kein Symbol in der Benachrichtigungs-Payload festgelegt ist, zeigt Android das in Weiß gerenderte Anwendungssymbol an.

Überschreiben onMessageReceived

Durch Überschreiben der Methode FirebaseMessagingService.onMessageReceived können Sie Aktionen basierend auf dem empfangenen RemoteMessage-Objekt ausführen und die Nachrichtendaten abrufen:

Kotlin

override fun onMessageReceived(remoteMessage: RemoteMessage) {
    // TODO(developer): Handle FCM messages here.
    // Not getting messages here? See why this may be: https://goo.gl/39bRNJ
    Log.d(TAG, "From: ${remoteMessage.from}")

    // Check if message contains a data payload.
    if (remoteMessage.data.isNotEmpty()) {
        Log.d(TAG, "Message data payload: ${remoteMessage.data}")

        // Check if data needs to be processed by long running job
        if (needsToBeScheduled()) {
            // For long-running tasks (10 seconds or more) use WorkManager.
            scheduleJob()
        } else {
            // Handle message within 10 seconds
            handleNow()
        }
    }

    // Check if message contains a notification payload.
    remoteMessage.notification?.let {
        Log.d(TAG, "Message Notification Body: ${it.body}")
    }

    // Also if you intend on generating your own notifications as a result of a received FCM
    // message, here is where that should be initiated. See sendNotification method below.
}

Java

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    // TODO(developer): Handle FCM messages here.
    // Not getting messages here? See why this may be: https://goo.gl/39bRNJ
    Log.d(TAG, "From: " + remoteMessage.getFrom());

    // Check if message contains a data payload.
    if (remoteMessage.getData().size() > 0) {
        Log.d(TAG, "Message data payload: " + remoteMessage.getData());

        if (/* Check if data needs to be processed by long running job */ true) {
            // For long-running tasks (10 seconds or more) use WorkManager.
            scheduleJob();
        } else {
            // Handle message within 10 seconds
            handleNow();
        }

    }

    // Check if message contains a notification payload.
    if (remoteMessage.getNotification() != null) {
        Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
    }

    // Also if you intend on generating your own notifications as a result of a received FCM
    // message, here is where that should be initiated. See sendNotification method below.
}

Überschreiben onDeletedMessages

In einigen Situationen wird mit FCM keine Nachricht gesendet. Das passiert, wenn zum Zeitpunkt der Verbindung zu viele Nachrichten (> 100) für Ihre App auf einem bestimmten Gerät ausstehen oder wenn das Gerät seit mehr als einem Monat keine Verbindung zu FCM hergestellt hat. In diesen Fällen erhalten Sie möglicherweise einen Rückruf unter FirebaseMessagingService.onDeletedMessages(). Wenn die App-Instanz diesen Callback empfängt, sollte sie eine vollständige Synchronisierung mit Ihrem App-Server durchführen. Wenn Sie in den letzten vier Wochen keine Nachricht an die App auf diesem Gerät gesendet haben, ruft FCM onDeletedMessages() nicht an.

Benachrichtigungen in einer im Hintergrund ausgeführten App verarbeiten

Wenn sich Ihre App im Hintergrund befindet, leitet Android Benachrichtigungen an die Taskleiste weiter. Wenn ein Nutzer auf die Benachrichtigung tippt, wird standardmäßig der App Launcher geöffnet.

Dazu gehören Nachrichten, die sowohl eine Benachrichtigungs- als auch eine Datennutzlast enthalten, sowie alle Nachrichten, die über die Notifications Console gesendet werden. In diesen Fällen wird die Benachrichtigung in der Taskleiste des Geräts angezeigt und die Daten-Payload wird in den Extras des Intents Ihrer Launcher-Aktivität bereitgestellt.

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“ (Benachrichtigungen, die von Nutzern gesehen wurden) für Android-Apps erfasst.