| Plattform auswählen: | iOS+ Android Web Flutter Unity C++ |
Zum Empfangen von Nachrichten können Sie einen Dienst verwenden, der FirebaseMessagingService erweitert.
Wenn Sie zu AndroidConfigV2 migrieren, implementieren Sie die spezialisierten Callbacks onNotificationReceived und onBackgroundSyncReceived, wie unter Android-Client-Callbacks aktualisieren beschrieben. Bei Legacy-AndroidConfig-Nachrichten (v1) sollte Ihr Dienst die Callbacks onMessageReceived und onDeletedMessages überschreiben. Ein vollständiges Beispiel finden Sie im Firebase Cloud Messaging-Schnellstartbeispiel.
onMessageReceived wird für die meisten Nachrichtentypen bereitgestellt, 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 Datennutzlast, die im Hintergrund empfangen werden. In diesem Fall wird die Benachrichtigung in der Taskleiste des Geräts angezeigt und die Datennutzlast wird in den Extras des Intents der Launcher-Aktivität bereitgestellt.
Zusammenfassung:
| App-Status | Benachrichtigung | Daten | Beides |
|---|---|---|---|
| Vordergrund | onMessageReceived |
onMessageReceived |
onMessageReceived |
| Hintergrund | Taskleiste | onMessageReceived |
Benachrichtigung: Taskleiste. Daten: in den Extras des Intents. |
Weitere Informationen zu Nachrichtentypen finden Sie unter Benachrichtigungen und Datennachrichten.
Der onMessageReceived-Callback hat ein kurzes Ausführungsfenster. Wie lange dieses Zeitfenster ist, hängt von vielen Faktoren ab, z. B. von Verzögerungen des Betriebssystems, der Startzeit der App, der Blockierung des Hauptthreads durch andere Vorgänge oder von vorherigen onMessageReceived-Aufrufen, die zu lange dauern.
Aus diesem Grund sollten Sie lang andauernde Aufgaben (z. B. das Abrufen von Bildern von einem Server, die in einer Benachrichtigung angezeigt werden sollen) in onMessageReceived vermeiden und stattdessen eine Aufgabe mit WorkManager planen, um alle Aufgaben zu verarbeiten, die länger als ein paar Sekunden dauern könnten. Weitere Informationen zur Nachrichtenpriorität und zu den Auswirkungen auf die Verarbeitung 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 Ihrem App-Manifest Folgendes hinzufü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 immer dann angewendet werden, wenn in der Benachrichtigungsnutzlast keine entsprechenden Werte festgelegt sind.
Fügen Sie diese Zeilen im application-Tag hinzu, 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 Notifications Composer in der Firebase Console gesendet werden.
Alle Benachrichtigungen, bei denen das Symbol in der Benachrichtigungsnutzlast nicht explizit festgelegt ist.
Wenn kein benutzerdefiniertes Standardsymbol und kein Symbol in der Benachrichtigungsnutzlast festgelegt ist, zeigt Android das Anwendungssymbol in Weiß an.
onMessageReceived überschreiben
Wenn Sie die Methode FirebaseMessagingService.onMessageReceived überschreiben, 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. }
onDeletedMessages überschreiben
In einigen Fällen kann es vorkommen, dass FCM eine Nachricht nicht zustellt. Dies geschieht, wenn zu viele Nachrichten (> 100) für Ihre App auf einem bestimmten Gerät ausstehen, wenn es eine Verbindung herstellt, 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 innerhalb der letzten vier Wochen keine Nachricht an die App auf diesem Gerät gesendet haben, ruft FCM onDeletedMessages() nicht auf.
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 Benachrichtigungs- als auch Datennutzlast enthalten, sowie alle Nachrichten, die über den Notifications Composer in der Firebase Console gesendet werden. In diesen Fällen wird die Benachrichtigung an die Taskleiste des Geräts und die Datennutzlast in den Extras des Intents der Launcher-Aktivität gesendet.
Informationen zur Nachrichtenzustellung an Ihre App finden Sie in der Firebase-Konsole unter DevOps & Engagement > Messaging > Berichte-Dashboard. In diesem Dashboard wird die Anzahl der Nachrichten erfasst, die auf Apple- und Android-Geräten gesendet und geöffnet wurden. Außerdem werden Daten zu „Impressionen“ (von Nutzern gesehene Benachrichtigungen) für Android-Apps angezeigt.