| Wybierz platformę: | iOS+ Android Web Flutter Unity C++ |
Aby otrzymywać wiadomości, możesz użyć usługi, która rozszerza
FirebaseMessagingService.
Usługa powinna zastępować wywołania zwrotne onMessageReceived i onDeletedMessages. Pełny przykład znajdziesz w przewodniku Szybki start Komunikacji w chmurze Firebase.
Wywołanie zwrotne onMessageReceived jest dostępne w przypadku większości typów wiadomości, z wyjątkiem tych:
Powiadomienia dostarczane, gdy aplikacja działa w tle. W takim przypadku powiadomienie jest dostarczane do obszaru powiadomień urządzenia. Domyślnie kliknięcie powiadomienia przez użytkownika powoduje otwarcie menu z aplikacjami.
Wiadomości z powiadomieniem i ładunkiem danych, które zostały odebrane w tle. W takim przypadku powiadomienie jest dostarczane do obszaru powiadomień urządzenia, a dane ładunku są dostarczane w dodatkach do intencji aktywności uruchamiającej.
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 do intencji. |
Więcej informacji o typach wiadomości znajdziesz w artykule Powiadomienia i wiadomości z danymi.
Wywołanie zwrotne onMessageReceived ma krótki czas wykonania. Na długość tego czasu może wpływać wiele czynników, m.in. opóźnienia systemu operacyjnego, czas uruchamiania aplikacji, blokowanie wątku głównego przez inne operacje lub zbyt długie wykonywanie poprzednich wywołań onMessageReceived.
Z tego powodu w przypadku wywołania zwrotnego onMessageReceived należy unikać długotrwałych zadań (takich jak pobieranie obrazów z serwera w celu wyświetlenia ich w powiadomieniu) i zamiast tego zaplanować zadanie za pomocą WorkManager, aby obsługiwać 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
wiadomości.
Edytowanie pliku manifestu aplikacji
Aby korzystać z FirebaseMessagingService, musisz dodać w 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 danych powiadomienia nie będą ustawione równoważne wartości.
Aby ustawić niestandardową ikonę domyślną i niestandardowy kolor, dodaj te wiersze w tagu application:
<!-- 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 w przypadku:
wszystkich powiadomień wysyłanych z kompozytora powiadomień w Firebase konsoli;
każdego powiadomienia, w którego danych nie jest wyraźnie ustawiona ikona.
Jeśli nie ustawisz niestandardowej ikony domyślnej, a w danych powiadomienia nie będzie ustawiona ikona, Android wyświetli ikonę aplikacji w kolorze białym.
Zastępowanie wywołania zwrotnego onMessageReceived
Zastępując metodę FirebaseMessagingService.onMessageReceived, możesz
wykonywać działania na podstawie otrzymanego
RemoteMessage
obiektu 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ępowanie wywołania zwrotnego onDeletedMessages
W niektórych sytuacjach FCM może nie dostarczyć wiadomości. Dzieje się tak, gdy
w momencie połączenia na danym urządzeniu oczekuje na aplikację zbyt wiele wiadomości (>100)
lub gdy urządzenie nie połączyło się z FCM od
ponad miesiąca. W takich przypadkach możesz otrzymać wywołanie zwrotne do 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 wywoła onDeletedMessages().
Obsługa powiadomień w aplikacji działającej w tle
Gdy aplikacja działa w tle, Android kieruje powiadomienia do obszaru powiadomień. Domyślnie kliknięcie powiadomienia przez użytkownika powoduje otwarcie menu z aplikacjami.
Dotyczy to wiadomości, które zawierają zarówno powiadomienie, jak i ładunek danych (oraz wszystkich wiadomości wysyłanych z Edytora powiadomień w konsoli Firebase). W takich przypadkach powiadomienie jest dostarczane do obszaru powiadomień urządzenia, a ładunek danych jest dostarczany w dodatkach do intencji aktywności uruchamiającej.
Aby uzyskać informacje o dostarczaniu wiadomości do aplikacji, otwórz w konsoli Firebase panel DevOps i zaangażowanie > Wiadomości > Raporty. Ten panel rejestruje liczbę wiadomości wysłanych i otwartych na urządzeniach Apple i Android oraz dane o „wyświetleniach” (powiadomieniach widzianych przez użytkowników) w przypadku aplikacji na Androida.