Powiadomienia Firebase zachowują się różnie w zależności od stanu pierwszego planu/tła aplikacji odbierającej. Jeśli chcesz, aby aplikacje działające na pierwszym planie otrzymywały powiadomienia lub wiadomości z danymi, musisz napisać kod do obsługi wywołania onMessageReceived
. Aby uzyskać wyjaśnienie różnicy między powiadomieniami a komunikatami z danymi, zobacz Typy komunikatów .
Obsługa wiadomości
Aby odbierać wiadomości, użyj usługi, która rozszerza FirebaseMessagingService . Twoja usługa powinna zastąpić wywołania zwrotne onMessageReceived
i onDeletedMessages
. Powinien obsłużyć każdą wiadomość w ciągu 20 sekund od otrzymania (10 sekund na Androidzie Marshmallow). Okno czasowe może być krótsze w zależności od opóźnień systemu operacyjnego przed wywołaniem onMessageReceived
. Po tym czasie różne zachowania systemu operacyjnego, takie jak limity wykonywania w tle Androida O, mogą przeszkadzać w ukończeniu pracy. Aby uzyskać więcej informacji, zapoznaj się z naszym przeglądem priorytetów wiadomości .
onMessageReceived
jest dostępny dla większości typów wiadomości, z następującymi wyjątkami:
Powiadomienia dostarczane, gdy aplikacja działa w tle . W takim przypadku powiadomienie jest dostarczane do zasobnika systemowego urządzenia. Dotknięcie powiadomienia przez użytkownika domyślnie otwiera program uruchamiający aplikacje.
Wiadomości z powiadomieniem i ładunkiem danych, gdy są odbierane w tle . W takim przypadku powiadomienie jest dostarczane do zasobnika systemowego urządzenia, a ładunek danych jest dostarczany w dodatkach intencji działania programu uruchamiającego.
W podsumowaniu:
Stan aplikacji | Powiadomienie | Dane | Obydwa |
---|---|---|---|
Pierwszoplanowy | onMessageReceived | onMessageReceived | onMessageReceived |
Tło | Taca systemowa | onMessageReceived | Powiadomienie: zasobnik systemowy Dane: w dodatkach intencji. |
Edytuj manifest aplikacji
Aby korzystać z FirebaseMessagingService
, w manifeście aplikacji musisz dodać:
<service android:name=".java.MyFirebaseMessagingService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
Zaleca się również ustawienie wartości domyślnych w celu dostosowania wyglądu powiadomień. Możesz określić niestandardową domyślną ikonę i niestandardowy domyślny kolor, które są stosowane, gdy w ładunku powiadomienia nie są ustawione równoważne wartości.
Dodaj te linie wewnątrz tagu application
, aby ustawić niestandardową domyślną ikonę i niestandardowy kolor:
<!-- 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 niestandardową domyślną ikonę dla
- Wszystkie powiadomienia wysłane z kompozytora powiadomień .
- Dowolny komunikat powiadomienia, który nie ustawia jawnie ikony w ładunku powiadomienia.
Android używa niestandardowego domyślnego koloru dla
- Wszystkie powiadomienia wysłane z kompozytora powiadomień .
- Dowolny komunikat powiadomienia, który nie ustawia jawnie koloru w ładunku powiadomienia.
Jeśli nie jest ustawiona niestandardowa ikona domyślna i żadna ikona nie jest ustawiona w ładunku powiadomienia, system Android wyświetla ikonę aplikacji w kolorze białym.
Zastąp onMessageReceived
Nadpisując metodę FirebaseMessagingService.onMessageReceived
możesz wykonać akcje na podstawie odebranego obiektu RemoteMessage i uzyskać dane komunikatu:
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. }
Zastąp onDeletedMessages
W niektórych sytuacjach FCM może nie dostarczyć wiadomości. Dzieje się tak, gdy dla Twojej aplikacji jest zbyt wiele oczekujących wiadomości (>100) w momencie łączenia lub gdy urządzenie nie łączy się z FCM od ponad miesiąca. W takich przypadkach możesz otrzymać wywołanie zwrotne do FirebaseMessagingService.onDeletedMessages()
Gdy instancja aplikacji odbierze to wywołanie zwrotne, powinna przeprowadzić pełną synchronizację z serwerem aplikacji. Jeśli nie wysłałeś wiadomości do aplikacji na tym urządzeniu w ciągu ostatnich 4 tygodni, FCM nie wywoła onDeletedMessages()
.Obsługuj powiadomienia w aplikacji działającej w tle
Gdy Twoja aplikacja działa w tle, Android kieruje powiadomienia do zasobnika systemowego. Dotknięcie powiadomienia przez użytkownika domyślnie otwiera program uruchamiający aplikacje.
Dotyczy to wiadomości, które zawierają zarówno powiadomienie, jak i ładunek danych (oraz wszystkie wiadomości wysłane z konsoli powiadomień). W takich przypadkach powiadomienie jest dostarczane do zasobnika systemowego urządzenia, a ładunek danych jest dostarczany w dodatkach związanych z intencją działania programu uruchamiającego.
Wgląd w dostarczanie wiadomości do Twojej aplikacji znajdziesz w panelu raportowania FCM , który rejestruje liczbę wiadomości wysłanych i otwartych na urządzeniach Apple i Android, a także dane dotyczące „wyświetleń” (powiadomień widzianych przez użytkowników) dla aplikacji na Androida.
Odbieraj komunikaty FCM w trybie rozruchu bezpośredniego
Deweloperzy, którzy chcą wysyłać komunikaty FCM do aplikacji jeszcze przed odblokowaniem urządzenia, mogą włączyć odbieranie wiadomości przez aplikację na Androida, gdy urządzenie jest w trybie rozruchu bezpośredniego. Na przykład możesz chcieć, aby użytkownicy Twojej aplikacji otrzymywali powiadomienia o alarmach nawet na zablokowanym urządzeniu.
Tworząc ten przypadek użycia, przestrzegaj ogólnych najlepszych praktyk i ograniczeń dotyczących trybu rozruchu bezpośredniego . Szczególnie ważne jest rozważenie widoczności komunikatów umożliwiających rozruch bezpośredni; każdy użytkownik mający dostęp do urządzenia może przeglądać te wiadomości bez wprowadzania poświadczeń użytkownika.
Wymagania wstępne
- Urządzenie musi być skonfigurowane do trybu rozruchu bezpośredniego.
- Na urządzeniu musi być zainstalowana najnowsza wersja usług Google Play (19.0.54 lub nowsza).
- Aby odbierać wiadomości FCM, aplikacja musi używać pakietu FCM SDK (
com.google.firebase:firebase-messaging
).
Włącz obsługę komunikatów w trybie rozruchu bezpośredniego w swojej aplikacji
W pliku Gradle na poziomie aplikacji dodaj zależność od biblioteki obsługi bezpośredniego rozruchu FCM:
implementation 'com.google.firebase:firebase-messaging-directboot:20.2.0'
Spraw, by
FirebaseMessagingService
była świadoma bezpośredniego rozruchu aplikacji, dodając atrybutandroid:directBootAware="true"
w manifeście aplikacji:<service android:name=".java.MyFirebaseMessagingService" android:exported="false" android:directBootAware="true"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
Ważne jest, aby upewnić się, że FirebaseMessagingService
może działać w trybie rozruchu bezpośredniego. Sprawdź następujące wymagania:
- Usługa nie powinna uzyskiwać dostępu do magazynu chronionego poświadczeniami, gdy działa w trybie rozruchu bezpośredniego.
- Usługa nie powinna próbować używać składników, takich jak
Activities
,BroadcastReceivers
ani innychServices
, które nie są oznaczone jako świadome rozruchu bezpośredniego podczas uruchamiania w trybie rozruchu bezpośredniego. - Żadne biblioteki używane przez usługę nie mogą również uzyskiwać dostępu do magazynu chronionego poświadczeniami ani wywoływać składników innych niż directBootAware podczas działania w trybie rozruchu bezpośredniego. Oznacza to, że wszystkie biblioteki używane przez aplikację, które są wywoływane z usługi, będą musiały być świadome bezpośredniego rozruchu lub aplikacja będzie musiała sprawdzić, czy działa w trybie rozruchu bezpośredniego, i nie wywoływać ich w tym trybie. Na przykład zestawy SDK Firebase działają z rozruchem bezpośrednim (można je dołączyć do aplikacji bez jej awarii w trybie rozruchu bezpośredniego), ale wiele interfejsów API Firebase nie obsługuje wywoływania w trybie rozruchu bezpośredniego.
- Jeśli aplikacja korzysta z niestandardowej
Application
,Application
będzie również musiała obsługiwać rozruch bezpośredni (brak dostępu do magazynu chronionego poświadczeniami w trybie rozruchu bezpośredniego).
Aby uzyskać wskazówki dotyczące wysyłania komunikatów do urządzeń w trybie rozruchu bezpośredniego, zobacz Wysyłanie komunikatów z włączoną funkcją rozruchu bezpośredniego .