Powiadomienia Firebase działają różnie w zależności od stanu pierwszego planu/w tle aplikacji odbierającej. Jeśli chcesz, aby aplikacje działające na pierwszym planie otrzymywały powiadomienia lub wiadomości dotyczące danych, musisz napisać kod do obsługi wywołania zwrotnego onMessageReceived
. Aby uzyskać wyjaśnienie różnicy między powiadomieniami a wiadomościami dotyczącymi danych, zobacz Typy wiadomości .
Obsługa wiadomości
Aby odbierać wiadomości, użyj usługi rozszerzającej 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ą zakłócać Twoją zdolność do ukończenia pracy. Aby uzyskać więcej informacji, zobacz nasz przegląd 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. Kliknięcie powiadomienia przez użytkownika domyślnie otwiera program uruchamiający aplikację.
Wiadomości z powiadomieniami i danymi, gdy są odbierane w tle . W takim przypadku powiadomienie jest dostarczane do zasobnika systemowego urządzenia, a ładunek danych jest dostarczany w dodatkach zgodnie z intencją działania programu uruchamiającego.
W podsumowaniu:
Stan aplikacji | Powiadomienie | Dane | Obie |
---|---|---|---|
Pierwszoplanowy | onMessageReceived | onMessageReceived | onMessageReceived |
Tło | Taca systemowa | onMessageReceived | Powiadomienie: taca systemowa Dane: w dodatkach intencji. |
Edytuj manifest aplikacji
Aby korzystać z FirebaseMessagingService
, musisz dodać następujące elementy w manifeście aplikacji:
<service android:name=".java.MyFirebaseMessagingService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
Ponadto zaleca się ustawienie wartości domyślnych, aby dostosować wygląd powiadomień. Można 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 przez kompozytora powiadomień .
- Każda wiadomość z powiadomieniem, która nie ustawia jawnie ikony w ładunku powiadomienia.
Android używa niestandardowego domyślnego koloru dla
- Wszystkie powiadomienia wysłane przez kompozytora powiadomień .
- Dowolny komunikat z powiadomieniem, który nie określa jawnie koloru w ładunku powiadomienia.
Jeśli nie ustawiono niestandardowej ikony domyślnej i nie ustawiono żadnej ikony w ładunku powiadomienia, system Android wyświetla ikonę aplikacji w kolorze białym.
Zastąp onMessageReceived
Zastępując metodę FirebaseMessagingService.onMessageReceived
, możesz wykonać akcje na podstawie otrzymanego obiektu RemoteMessage i uzyskać dane wiadomości:
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. }
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}") 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. 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. }
Zastąp onDeletedMessages
W niektórych sytuacjach FCM może nie dostarczyć wiadomości. Dzieje się tak, gdy jest zbyt wiele wiadomości (>100) oczekujących na aplikację na określonym urządzeniu w momencie łączenia się lub jeśli urządzenie nie łączy się z FCM przez ponad miesiąc. W takich przypadkach możesz otrzymać wywołanie zwrotne do FirebaseMessagingService.onDeletedMessages()
Gdy wystąpienie aplikacji odbierze to wywołanie zwrotne, powinno wykonać 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 onDeletedMessages()
.Obsługa powiadomień 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 aplikację.
Obejmuje to wiadomości zawierające zarówno powiadomienia, jak i ładunek danych (oraz wszystkie wiadomości wysyłane z konsoli powiadomień). W takich przypadkach powiadomienie jest dostarczane do zasobnika systemowego urządzenia, a ładunek danych jest dostarczany w dodatkach zgodnie z intencją Aktywności programu uruchamiającego.
Aby uzyskać wgląd w dostarczanie wiadomości do Twojej aplikacji, zapoznaj się z panelem raportowania FCM , który rejestruje liczbę wiadomości wysłanych i otwartych na urządzeniach Apple i Android wraz z danymi dotyczącymi „wyświetleń” (powiadomień widzianych przez użytkowników) w przypadku aplikacji na Androida.
Aplikacje z ograniczonym dostępem w tle (Android P lub nowszy)
FCM może nie dostarczać wiadomości do aplikacji, które zostały ustawione w tle przez użytkownika (na przykład przez: Ustawienia -> Aplikacje i powiadomienia -> [nazwa aplikacji] -> Bateria). Gdy aplikacja zostanie usunięta z ograniczenia w tle, nowe wiadomości do aplikacji będą dostarczane tak jak poprzednio. Aby zapobiec utracie wiadomości i innym wpływom ograniczeń w tle, unikaj złych zachowań wymienionych w wysiłkach Android Vitals . Takie zachowania mogą spowodować, że urządzenie z Androidem zaleci użytkownikowi ograniczenie aplikacji w tle. Twoja aplikacja może sprawdzić, czy jest ograniczona w tle, używając: isBackgroundRestricted() .Odbieraj wiadomości FCM w trybie bezpośredniego rozruchu
Deweloperzy, którzy chcą wysyłać wiadomości FCM do aplikacji jeszcze przed odblokowaniem urządzenia, mogą umożliwić aplikacji na Androida otrzymywanie wiadomości, 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.
Podczas tworzenia tego przypadku użycia należy przestrzegać ogólnych sprawdzonych metod i ograniczeń dotyczących trybu rozruchu bezpośredniego . Szczególnie ważne jest, aby wziąć pod uwagę widoczność komunikatów związanych z bezpośrednim rozruchem; każdy użytkownik mający dostęp do urządzenia może przeglądać te wiadomości bez wprowadzania danych uwierzytelniających użytkownika.
Warunki 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).
- Aplikacja musi korzystać z pakietu SDK FCM (
com.google.firebase:firebase-messaging
), aby otrzymywać wiadomości FCM.
Włącz obsługę komunikatów trybu bezpośredniego rozruchu w swojej aplikacji
W pliku Gradle na poziomie aplikacji dodaj zależność od biblioteki obsługi rozruchu bezpośredniego FCM:
implementation 'com.google.firebase:firebase-messaging-directboot:20.2.0'
Włącz obsługę bezpośredniego rozruchu
FirebaseMessagingService
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 ta FirebaseMessagingService
mogła działać w trybie rozruchu bezpośredniego. Sprawdź następujące wymagania:
- Usługa nie powinna uzyskiwać dostępu do magazynu chronionego danymi uwierzytelniającymi podczas działania w trybie rozruchu bezpośredniego.
- Usługa nie powinna próbować używać składników, takich jak
Activities
,BroadcastReceivers
lub inneServices
, które nie są oznaczone jako rozpoznające rozruch bezpośredni podczas działania w trybie rozruchu bezpośredniego. - Wszelkie biblioteki używane przez usługę nie mogą również uzyskiwać dostępu do magazynu chronionego danymi uwierzytelniającymi ani wywoływać składników innych niż bezpośrednie BootAware 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 bezpośredniego rozruchu i nie wywoływać ich w tym trybie. Na przykład pakiety SDK Firebase działają z rozruchem bezpośrednim (mogą być dołączone 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
Application
niestandardowej ,Application
będzie również musiała obsługiwać funkcję bezpośredniego rozruchu (brak dostępu do magazynu chronionego danymi uwierzytelniającymi w trybie rozruchu bezpośredniego).
Aby uzyskać wskazówki dotyczące wysyłania wiadomości do urządzeń w trybie rozruchu bezpośredniego, zobacz Wysyłanie wiadomości z włączonym rozruchem bezpośrednim .