| Wybierz platformę: | iOS+ Android Web Flutter Unity C++ |
Aby otrzymywać wiadomości, możesz użyć usługi, która rozszerza klasę FirebaseMessagingService.
Usługa powinna zastępować wywołania zwrotne onMessageReceived i onDeletedMessages. Pełny przykład znajdziesz w przykładowym krótkim wprowadzeniu do Komunikacji w chmurze Firebase.
Wartość onMessageReceived jest podawana w przypadku większości typów wiadomości z tymi wyjątkami:
Wiadomości z powiadomieniem dostarczane, gdy aplikacja działa w tle W takim przypadku powiadomienie jest dostarczane do obszaru powiadomień urządzenia. Kliknięcie powiadomienia przez użytkownika domyślnie otwiera Menu z aplikacjami.
Wiadomości zawierające zarówno powiadomienie, jak i ładunek danych, gdy są odbierane w tle. W takim przypadku powiadomienie jest dostarczane do obszaru powiadomień urządzenia, a ładunek danych jest dostarczany w dodatkach intencji aktywności programu uruchamiającego.
W skrócie:
| Stan aplikacji | Powiadomienie | Dane | Oba rodzaje |
|---|---|---|---|
| Pierwszy plan | onMessageReceived |
onMessageReceived |
onMessageReceived |
| Tło | Obszar powiadomień | onMessageReceived |
Powiadomienie: obszar powiadomień Dane: w dodatkach intencji. |
Więcej informacji o typach wiadomości znajdziesz w artykule Powiadomienia i wiadomości z danymi.
Wywołanie zwrotne onMessageReceived ma krótkie okno wykonywania. Na czas trwania tego okna może wpływać wiele czynników, w tym opóźnienia systemu operacyjnego, czas uruchamiania aplikacji, blokowanie wątku głównego przez inne operacje lub zbyt długie wywołania onMessageReceived.
Z tego powodu należy unikać długotrwałych zadań (takich jak pobieranie obrazów z serwera do wyświetlenia w powiadomieniu) w onMessageReceived i zamiast tego zaplanować zadanie za pomocą WorkManager, aby obsłużyć wszystkie zadania, których wykonanie może potrwać dłużej niż kilka sekund. Więcej informacji o priorytecie wiadomości i jego wpływie na przetwarzanie znajdziesz w artykule Przetwarzanie wiadomości o wysokim i normalnym priorytecie.
Edytowanie pliku manifestu aplikacji
Aby używać FirebaseMessagingService, musisz dodać do pliku manifestu aplikacji te elementy:
<service
android:name=".java.MyFirebaseMessagingService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
Zalecamy ustawienie wartości domyślnych, aby dostosować wygląd powiadomień. Możesz określić niestandardową ikonę domyślną i niestandardowy kolor domyślny, które będą stosowane, gdy w ładunku powiadomienia nie zostaną ustawione odpowiednie wartości.
Dodaj te wiersze w tagu application, aby ustawić niestandardową ikonę domyślną i spersonalizowane kolory:
<!-- 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 wyświetla i używa niestandardowej ikony domyślnej dla
Wszystkie powiadomienia wysyłane z Kreatora powiadomień w konsoli Firebase.
Wszystkie wiadomości z powiadomieniem, które nie mają wyraźnie ustawionej ikony w ładunku powiadomienia.
Jeśli nie ustawiono niestandardowej ikony domyślnej ani ikony w ładunku powiadomienia, Android wyświetla ikonę aplikacji w kolorze białym.
Zastąp: onMessageReceived
Zastępując metodę FirebaseMessagingService.onMessageReceived, możesz wykonywać działania na podstawie otrzymanego obiektu RemoteMessage i pobierać dane wiadomości:
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. }
Zastąp: onDeletedMessages
W niektórych sytuacjach FCM może nie dostarczyć wiadomości. Dzieje się tak, gdy w momencie połączenia na danym urządzeniu jest zbyt wiele wiadomości (>100) oczekujących na aplikację lub gdy urządzenie nie łączyło się z FCM przez ponad miesiąc. W takich przypadkach możesz otrzymać połączenie na numer FirebaseMessagingService.onDeletedMessages(). Gdy instancja aplikacji otrzyma to wywołanie zwrotne, powinna przeprowadzić pełną synchronizację z serwerem aplikacji. Jeśli w ciągu ostatnich 4 tygodni nie wysłano wiadomości do aplikacji na tym urządzeniu, FCM nie zadzwoni do onDeletedMessages().
Obsługa powiadomień w aplikacji działającej w tle
Gdy aplikacja działa w tle, Android kieruje powiadomienia do obszaru powiadomień. Kliknięcie powiadomienia przez użytkownika domyślnie otwiera Menu z aplikacjami.
Obejmuje to wiadomości, które zawierają zarówno powiadomienie, jak i ładunek danych (oraz wszystkie wiadomości wysyłane z Kreatora powiadomień w konsoli Firebase). W takich przypadkach powiadomienie jest dostarczane do obszaru powiadomień urządzenia, a ładunek danych jest dostarczany w dodatkach intencji aktywności programu uruchamiającego.
Aby uzyskać statystyki dotyczące dostarczania wiadomości do aplikacji, otwórz panel DevOps i zaangażowanie > Przesyłanie wiadomości > Raporty w konsoli Firebase. Ten panel rejestruje liczbę wiadomości wysłanych i otwartych na urządzeniach Apple i urządzeniach z Androidem, a także dane dotyczące „wyświetleń” (powiadomień wyświetlonych użytkownikom) w aplikacjach na Androida.