Firebase-Benachrichtigungen verhalten sich je nach Vorder- und Hintergrund unterschiedlich.
Status der empfangenden App. Wenn Sie möchten, dass Apps im Vordergrund
oder Datenmeldungen erhalten möchten, müssen Sie Code schreiben,
onMessageReceived
-Callback
Eine Erklärung zum Unterschied zwischen Benachrichtigungs- und Datennachrichten finden Sie unter Nachrichtentypen.
Umgang mit Nachrichten
Nutzen Sie zum Empfangen von Nachrichten einen Dienst,
FirebaseMessagingService
Ihr Dienst sollte onMessageReceived
und onDeletedMessages
überschreiben.
Callbacks angegeben werden.
Das Zeitfenster für die Verarbeitung einer Nachricht kann kürzer als 20 Sekunden sein, je nach Verzögerungen vor dem Aufruf von onMessageReceived
. Dazu gehören Betriebssystemverzögerungen, die App-Startzeit, das Blockieren des Hauptthreads durch andere Vorgänge oder zu lange vorherige onMessageReceived
-Aufrufe. Danach können verschiedene Betriebssystemfunktionen wie das Beenden von Prozessen unter Android oder die Einschränkungen für die Hintergrundausführung unter Android O Ihre Arbeit beeinträchtigen.
onMessageReceived
ist für die meisten Nachrichtentypen verfügbar, darunter:
Ausnahmen:
-
Benachrichtigungen, die zugestellt werden, wenn die App im Hintergrund ausgeführt wird: In dieser wird die Benachrichtigung in der Taskleiste des Geräts abgelegt. Ein Nutzer tippt auf eine Benachrichtigung. öffnet den App Launcher standardmäßig.
-
Nachrichten mit Benachrichtigungs- und Datennutzlast, wenn sie 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 der Launcher-Aktivität.
Zusammenfassung:
App-Status | Benachrichtigung | Daten | Beides |
---|---|---|---|
Vordergrund | onMessageReceived |
onMessageReceived |
onMessageReceived |
Hintergrund | Taskleiste | onMessageReceived |
Benachrichtigung: Taskleiste Daten: in Extras des Intents. |
App-Manifest bearbeiten
Wenn Sie FirebaseMessagingService
verwenden möchten, müssen Sie Folgendes in Ihr
App-Manifest:
<service android:name=".java.MyFirebaseMessagingService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
Außerdem wird empfohlen, Standardwerte festzulegen, um die Darstellung von Benachrichtigungen anzupassen. Ich ein benutzerdefiniertes Standardsymbol und eine benutzerdefinierte Standardfarbe festlegen, die immer angewendet werden, äquivalente Werte nicht in der Benachrichtigungsnutzlast festgelegt sind.
Fügen Sie diese Zeilen
application
-Tag, 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 für
- Alle Benachrichtigungen, die vom Notifications Composer.
- Jede Benachrichtigungsnachricht, für die das Symbol in der Benachrichtigungsnutzlast nicht explizit festgelegt wurde.
Android verwendet die benutzerdefinierte Standardfarbe für
- Alle Benachrichtigungen, die vom Notifications Composer.
- Alle Benachrichtigungsnachrichten, bei denen die Farbe der Benachrichtigung nicht explizit festgelegt wird Payload.
Wenn kein benutzerdefiniertes Standardsymbol und kein Symbol in der Benachrichtigungsnutzlast festgelegt ist, In Android ist das App-Symbol weiß dargestellt.
onMessageReceived
überschreiben
Wenn Sie die Methode FirebaseMessagingService.onMessageReceived
überschreiben,
Aktionen basierend auf den empfangenen
RemoteMessage
und rufen Sie die Nachrichtendaten ab:
Kotlin+KTX
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 wird eine Nachricht von FCM möglicherweise nicht zugestellt. Das passiert, wenn zu viele
ausstehende Nachrichten (>100) für
Ihre App auf einem bestimmten Gerät ausgeführt hat, als sie verbunden ist oder wenn das Gerät noch nicht mit
FCM in mehr als einem Monat. In diesen Fällen
erhältst du eventuell einen Rückruf an FirebaseMessagingService.onDeletedMessages()
Wenn die App-Instanz diesen Callback empfängt,
sollte eine vollständige Synchronisierung
mit Ihrem Anwendungsserver durchgeführt werden. Wenn du auf diesem Gerät keine Nachricht an die App gesendet hast
in den letzten 4 Wochen verwendet, ruft FCM onDeletedMessages()
nicht an.
Benachrichtigungen in einer App im Hintergrund verarbeiten
Wenn deine App im Hintergrund ausgeführt wird, leitet Android Benachrichtigungen an folgende Adresse weiter: in die Taskleiste. Wenn ein Nutzer auf die Benachrichtigung tippt, wird standardmäßig der App Launcher geöffnet.
Dazu gehören Nachrichten, die sowohl Benachrichtigungen als auch Daten enthalten Payload (und alle Nachrichten, die von der Notifications-Konsole gesendet werden). In diesen Fällen wird die Benachrichtigung an den in der Taskleiste und die Datennutzlast wird in den Extras des Intents bereitgestellt. deiner Launcher-Aktivitäten.
Informationen zur Zustellung von Nachrichten an Ihre App finden Sie im FCMBerichtsdashboard. Dort werden die Anzahl der auf Apple- und Android-Geräten gesendeten und geöffneten Nachrichten sowie Daten zu „Impressionen“ (von Nutzern gesehene Benachrichtigungen) für Android-Apps erfasst.
FCM-Nachrichten im Direct Boot-Modus empfangen
Entwickler, die FCM-Nachrichten an Apps senden möchten, noch bevor das Gerät entsperrt wird, können einer Android-App erlauben, Nachrichten zu empfangen, wenn sich das Gerät im Direktstartmodus befindet. Beispielsweise möchten Sie, dass Nutzer Ihrer App Alarmbenachrichtigungen auch auf gesperrten Geräten erhalten.
Beachten Sie beim Entwickeln dieses Anwendungsfalls die allgemeinen Best Practices und Einschränkungen für den direkten Boot-Modus. Es ist besonders wichtig, um die Sichtbarkeit von direkt nach dem Start ermöglichten Nachrichten; kann jeder Nutzer mit Zugriff auf das Gerät diese Nachrichten ohne Nutzeranmeldedaten eingeben.
Vorbereitung
- Das Gerät muss für den direkten Bootmodus eingerichtet sein.
- Auf dem Gerät muss eine aktuelle Version der Google Play-Dienste (19.0.54 oder höher) installiert sein.
- Die App muss das FCM SDK (
com.google.firebase:firebase-messaging
) verwenden, um FCM-Nachrichten zu empfangen.
Nachrichtenverarbeitung im direkten Bootmodus in Ihrer App aktivieren
Fügen Sie in der Gradle-Datei auf App-Ebene eine Abhängigkeit von der FCM Direct Boot-Supportbibliothek hinzu:
implementation 'com.google.firebase:firebase-messaging-directboot:20.2.0'
Machen Sie die App für den direkten Start über
FirebaseMessagingService
bereit, indem Sie das Attributandroid:directBootAware="true"
in das App-Manifest einfügen:<service android:name=".java.MyFirebaseMessagingService" android:exported="false" android:directBootAware="true"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
Achten Sie darauf, dass dieser FirebaseMessagingService
im direkten Bootmodus ausgeführt werden kann. Prüfen
für folgende Anforderungen:
- Der Dienst sollte nicht auf mit Anmeldedaten geschützten Speicher zugreifen, während er im direkten Boot-Modus ausgeführt wird.
- Der Dienst sollte nicht versuchen, Komponenten wie
Activities
,BroadcastReceivers
, oder andereServices
-Elemente, die nicht als „Direct Boot Aware“ gekennzeichnet sind, während sie im direkten Bootmodus ausgeführt werden. - Bibliotheken, die der Dienst verwendet, dürfen weder auf Anmeldedaten-geschützten Speicher noch auf Non-directBootAware-Komponenten im direkten Bootmodus aufrufen. Das bedeutet, dass alle Bibliotheken die vom Dienst aufgerufene App entweder direkt gestartet werden muss muss die App prüfen, ob sie im direkten Bootmodus ausgeführt wird, und sie nicht in diesem Modus aufrufen. Firebase SDKs können beispielsweise direkt in eine App eingebunden werden, ohne im direkten Bootmodus zum Absturz bringen, aber viele Firebase APIs unterstützen den Aufruf im direkten Bootmodus nicht. Bootmodus starten können.
- Wenn die App ein benutzerdefiniertes
Application
verwendet, mussApplication
auch direkt gestartet werden bewusst (kein Zugriff auf Anmeldedaten-geschützten Speicher im direkten Bootmodus).
Eine Anleitung zum Senden von Nachrichten an Geräte im direkten Bootmodus finden Sie unter Nachrichten mit aktiviertem Direct Boot senden