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.