| Wybierz platformę: | iOS+ Android Web Flutter Unity C++ |
Z tego przewodnika dowiesz się, jak zacząć korzystać z Firebase Cloud Messaging w aplikacjach klienckich na Androida, aby niezawodnie wysyłać wiadomości.
FCM wymagają urządzeń z Androidem 6.0 lub nowszym, na których jest zainstalowana aplikacja Sklep Google Play, lub emulatora z Androidem 6.0 i interfejsami API Google. Pamiętaj, że nie musisz wdrażać aplikacji na Androida tylko w Sklepie Google Play.
Konfigurowanie pakietu SDK
Dodaj Firebase do projektu aplikacji na Androida, jeśli nie korzystasz w nim jeszcze z tej usługi.
Aby zapewnić optymalne działanie FCM, zdecydowanie zalecamy włączenieGoogle Analytics w projekcie. Google Analytics jest wymagany w przypadku raportowania dostarczania wiadomości w FCM.
Edytowanie pliku manifestu aplikacji
Dodaj do pliku manifestu aplikacji te elementy:
- Usługa, która rozszerza
FirebaseMessagingService. Jest to wymagane, jeśli chcesz wykonywać inne działania związane z obsługą wiadomości niż tylko otrzymywanie powiadomień w aplikacjach działających w tle. Aby otrzymywać powiadomienia w aplikacjach działających na pierwszym planie, otrzymywać ładunek danych i korzystać z innych funkcji, musisz rozszerzyć tę usługę. - (Opcjonalnie) W komponencie aplikacji elementy metadanych do ustawiania domyślnej ikony i koloru powiadomienia. Android używa tych wartości, gdy w przychodzących wiadomościach nie określono wyraźnie ikony ani koloru.
- (Opcjonalnie) W Androidzie 8.0 (interfejs API na poziomie 26) i nowszych wersjach obsługiwane i zalecane są
kanały powiadomień. FCM udostępnia domyślny kanał powiadomień z podstawowymi ustawieniami. Jeśli wolisz
utworzyć i używać własnego kanału domyślnego, ustaw
default_notification_channel_idna identyfikator obiektu kanału powiadomień, jak pokazano powyżej. FCM będzie używać tej wartości, gdy wiadomości przychodzące nie będą wyraźnie ustawiać kanału powiadomień. Więcej informacji znajdziesz w artykule Zarządzanie kanałami powiadomień.
<service android:name=".java.MyFirebaseMessagingService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
<!-- 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" />
<meta-data android:name="com.google.firebase.messaging.default_notification_channel_id" android:value="@string/default_notification_channel_id" />
Żądanie zgody na wyświetlanie powiadomień w czasie działania w Androidzie 13 lub nowszym
Android 13 wprowadza nowe uprawnienia w czasie działania aplikacji do wyświetlania powiadomień. Dotyczy to wszystkich aplikacji działających na Androidzie 13 lub nowszym, które korzystają z FCMpowiadomień.
Domyślnie pakiet SDK FCM (w wersji 23.0.6 lub nowszej) zawiera uprawnienie POST_NOTIFICATIONS zdefiniowane w pliku manifestu. Aplikacja musi jednak też poprosić o wersję tego uprawnienia w czasie działania za pomocą stałej android.permission.POST_NOTIFICATIONS. Aplikacja nie będzie mogła wyświetlać powiadomień, dopóki użytkownik nie przyzna jej tego uprawnienia.
Aby poprosić o nowe uprawnienia w czasie działania (aplikacji):
Kotlin
// Declare the launcher at the top of your Activity/Fragment: private val requestPermissionLauncher = registerForActivityResult( ActivityResultContracts.RequestPermission(), ) { isGranted: Boolean -> if (isGranted) { // FCM SDK (and your app) can post notifications. } else { // TODO: Inform user that that your app will not show notifications. } } private fun askNotificationPermission() { // This is only necessary for API level >= 33 (TIRAMISU) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED ) { // FCM SDK (and your app) can post notifications. } else if (shouldShowRequestPermissionRationale(Manifest.permission.POST_NOTIFICATIONS)) { // TODO: display an educational UI explaining to the user the features that will be enabled // by them granting the POST_NOTIFICATION permission. This UI should provide the user // "OK" and "No thanks" buttons. If the user selects "OK," directly request the permission. // If the user selects "No thanks," allow the user to continue without notifications. } else { // Directly ask for the permission requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS) } } }
Java
// Declare the launcher at the top of your Activity/Fragment: private final ActivityResultLauncher<String> requestPermissionLauncher = registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> { if (isGranted) { // FCM SDK (and your app) can post notifications. } else { // TODO: Inform user that that your app will not show notifications. } }); private void askNotificationPermission() { // This is only necessary for API level >= 33 (TIRAMISU) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED) { // FCM SDK (and your app) can post notifications. } else if (shouldShowRequestPermissionRationale(Manifest.permission.POST_NOTIFICATIONS)) { // TODO: display an educational UI explaining to the user the features that will be enabled // by them granting the POST_NOTIFICATION permission. This UI should provide the user // "OK" and "No thanks" buttons. If the user selects "OK," directly request the permission. // If the user selects "No thanks," allow the user to continue without notifications. } else { // Directly ask for the permission requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS); } } }
Zazwyczaj należy wyświetlać interfejs wyjaśniający użytkownikowi funkcje, które zostaną włączone, jeśli przyzna on aplikacji uprawnienia do wysyłania powiadomień. Interfejs użytkownika powinien zawierać opcje zgody i odmowy, takie jak przyciski OK i Nie, dziękuję. Jeśli użytkownik kliknie OK, bezpośrednio poproś o uprawnienia. Jeśli użytkownik wybierze Nie, dziękuję, pozwól mu kontynuować bez powiadomień.
Więcej sprawdzonych metod dotyczących tego, kiedy aplikacja powinna prosić użytkownika o uprawnienie POST_NOTIFICATIONS, znajdziesz w artykule Uprawnienia w czasie działania powiadomień.
Uprawnienia do powiadomień w przypadku aplikacji kierowanych na Androida 12L (poziom API 32) lub starszego
Android automatycznie prosi użytkownika o zezwolenie przy pierwszym utworzeniu przez aplikację kanału powiadomień, o ile aplikacja jest na pierwszym planie. Istnieją jednak ważne zastrzeżenia dotyczące czasu utworzenia kanału i przesyłania próśb o uprawnienia:
- Jeśli aplikacja utworzy pierwszy kanał powiadomień, gdy działa w tle (co robi pakiet SDK FCM po otrzymaniu powiadomienia FCM), Android nie zezwoli na wyświetlenie powiadomienia i nie poprosi użytkownika o uprawnienia do powiadomień, dopóki aplikacja nie zostanie ponownie otwarta. Oznacza to, że wszystkie powiadomienia otrzymane przed otwarciem aplikacji i zaakceptowaniem uprawnień przez użytkownika zostaną utracone.
- Zdecydowanie zalecamy zaktualizowanie aplikacji, aby była kierowana na Androida 13 lub nowszego. Dzięki temu będzie można korzystać z interfejsów API platformy do wysyłania próśb o uprawnienia. Jeśli to niemożliwe, aplikacja powinna utworzyć kanały powiadomień przed wysłaniem do niej jakichkolwiek powiadomień, aby wywołać okno dialogowe z prośbą o przyznanie zgody na wyświetlanie powiadomień i mieć pewność, że żadne powiadomienia nie zostaną utracone. Więcej informacji znajdziesz w sprawdzonych metodach dotyczących zgody na wyświetlanie powiadomień.
Opcjonalnie: usuń uprawnienie POST_NOTIFICATIONS
Domyślnie pakiet SDK FCM zawiera uprawnienie POST_NOTIFICATIONS.
Jeśli Twoja aplikacja nie korzysta z wiadomości z powiadomieniami (ani za pomocą powiadomień, ani za pomocą innego pakietu SDK, ani nie publikuje ich bezpośrednio) i nie chcesz, aby zawierała to uprawnienie, możesz je usunąć za pomocą znacznika remove narzędzia do łączenia plików manifestu.FCM Pamiętaj, że usunięcie tego uprawnienia uniemożliwia wyświetlanie wszystkich powiadomień, a nie tylko powiadomień FCM. Dodaj do pliku manifestu aplikacji te elementy:
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" tools:node="remove"/>
Dostęp do identyfikatora instalacji Firebase
Podczas pierwszego uruchomienia aplikacji pakiet SDK FCM rejestruje instancję aplikacji w FCM i zwraca identyfikator instancji aplikacji. Jeśli chcesz kierować reklamy na poszczególne instancje aplikacji, musisz uzyskać dostęp do tego identyfikatora, rozszerzając
FirebaseMessagingService i zastępując
onRegistered().
Zgodnie ze sprawdzonymi metodami pobieraj najnowszy zaktualizowany identyfikator, ponieważ po początkowym uruchomieniu może on ulec zmianie.
Włączanie rejestracji za pomocą identyfikatora instalacji Firebase
Aby umożliwić rejestrowanie instancji aplikacji w FCM za pomocą identyfikatora instalacji Firebase (FID), dodaj do plikuAndroidManifest.xml ten flagę metadanych:
<meta-data android:name="firebase_messaging_installation_id_enabled" android:value="true" />
Zaimplementuj wywołanie zwrotne onRegistered().
Instancje aplikacji są kierowane za pomocą identyfikatora instalacji Firebase (FID) po zarejestrowaniu w FCM. Aby pobrać identyfikator FID podczas rejestracji, zaimplementuj wywołanie zwrotne
onRegistered().
Gdy instancja aplikacji zostanie zarejestrowana, pakiet SDK FCM automatycznie monitoruje zmiany identyfikatora FID i wywołuje funkcję zwrotną po wykryciu zmiany.
Gdy automatyczna inicjalizacja jest włączona, pakiet SDK FCM automatycznie synchronizuje się z backendem FCM, aby rejestracja była aktualna, i wywołuje wywołanie zwrotne, aby serwer aplikacji miał bieżący identyfikator. Aby zapobiec utracie identyfikatora FID lub jego nieaktualności, wysyłaj go na serwer aplikacji za każdym razem, gdy wywoływane jest to wywołanie zwrotne.
Kotlin
/** * There are three scenarios when `onRegistered` is called: * 1) Every time a manual `register()` call finishes successfully * 2) Whenever the FID is changed and the app is re-registered with FCM via the new FID. * 3) Automatically on app startup or routine sync when auto-initialization is enabled. * Under #2, there are three scenarios when the existing FID is changed: * A) App is restored to a new device * B) User uninstalls/reinstalls the app * C) User clears app data */ override fun onRegistered(installationId: String) { Log.d(TAG, "Registered installation ID: $installationId") // Send the Firebase Installation ID to your app server. sendRegistrationToServer(installationId) }
Java
/** * There are three scenarios when `onRegistered` is called: * 1) Every time a manual `register()` call finishes successfully * 2) Whenever the FID is changed and the app is re-registered with FCM via the new FID * 3) Automatically on app startup or routine sync when auto-initialization is enabled. * Under #2, there are three scenarios when the existing FID is changed: * A) App is restored to a new device * B) User uninstalls/reinstalls the app * C) User clears app data */ @Override public void onRegistered(@NonNull String installationId) { Log.d(TAG, "Registered installation ID: " + installationId); // Send the Firebase Installation ID to your app server. sendRegistrationToServer(installationId); }
Ręczna rejestracja, gdy automatyczna inicjalizacja jest wyłączona
Jeśli musisz wyłączyć automatyczną inicjalizację, pakiet SDK FCM nie będzie automatycznie synchronizować ani wywoływać funkcji zwrotnej
onRegistered() podczas uruchamiania. Zdecydowanie zalecamy ponowne włączenie automatycznej inicjalizacji po przyznaniu uprawnień do powiadomień. Więcej informacji znajdziesz w artykule
Ponowne włączanie automatycznej inicjalizacji.
Jeśli automatyczna inicjalizacja musi pozostać wyłączona, wywołaj funkcję
FirebaseMessaging.getInstance().register() przy uruchamianiu aplikacji, aby wywołać rejestrację i przesyłanie identyfikatora FID za pomocą wywołania zwrotnego
onRegistered(). Możesz wykonać to połączenie w ramach metody
onCreate() głównego Activity.
Kotlin
// Trigger manual registration if auto-initialization is turned off. // Consider calling this every time the app starts to guarantee sync status. FirebaseMessaging.getInstance().register() .addOnCompleteListener(this) { task -> if (!task.isSuccessful()) { // Registration failed. Consider retrying the registration with exponential backoff. Log.w(TAG, "Failed to register with Firebase Cloud Messaging", task.exception) } // Success! The Firebase Installation ID can be used to target messages to this app // instance and will be delivered asynchronously to your `onRegistered()` callback. }
Java
// Trigger manual registration if auto-initialization is turned off. // Consider calling this every time the app starts to guarantee sync status. FirebaseMessaging.getInstance().register() .addOnCompleteListener(task -> { if (!task.isSuccessful()) { // Registration failed. Consider retrying the registration with exponential backoff. Log.w(TAG, "Failed to register with Firebase Cloud Messaging", task.exception) } // Success! The Firebase Installation ID can be used to target messages to this app // instance and will be delivered asynchronously to your `onRegistered()` callback. });
Dostęp do tokena rejestracji FCM (wycofano)
Przy pierwszym uruchomieniu aplikacji pakiet SDK FCM generuje token rejestracyjny dla instancji aplikacji klienckiej. Jeśli chcesz kierować reklamy na pojedyncze instancje aplikacji lub tworzyć grupy urządzeń, musisz uzyskać dostęp do tego tokena, rozszerzając
FirebaseMessagingService i zastępując onNewToken. Po początkowym uruchomieniu token może zostać zmieniony, dlatego zdecydowanie zalecamy pobranie najnowszego zaktualizowanego tokena rejestracji.
Token rejestracji może się zmienić, gdy:
- Aplikacja zostanie przywrócona na nowym urządzeniu.
- Użytkownik odinstaluje lub ponownie zainstaluje aplikację
- Użytkownik czyści dane aplikacji.
Pobieranie bieżącego tokena rejestracji
Aby pobrać bieżący token, wywołaj:
FirebaseMessaging.getInstance().getToken()
Kotlin
FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task -> if (!task.isSuccessful) { Log.w(TAG, "Fetching FCM registration token failed", task.exception) return@OnCompleteListener } // Get new FCM registration token val token = task.result // Log and toast val msg = getString(R.string.msg_token_fmt, token) Log.d(TAG, msg) Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show() })
Java
FirebaseMessaging.getInstance().getToken() .addOnCompleteListener(new OnCompleteListener<String>() { @Override public void onComplete(@NonNull Task<String> task) { if (!task.isSuccessful()) { Log.w(TAG, "Fetching FCM registration token failed", task.getException()); return; } // Get new FCM registration token String token = task.getResult(); // Log and toast String msg = getString(R.string.msg_token_fmt, token); Log.d(TAG, msg); Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show(); } });
Monitorowanie generowania tokenów
Wywołanie zwrotne onNewToken jest uruchamiane za każdym razem, gdy generowany jest nowy token.
Kotlin
/** * Called if the FCM registration token is updated. This may occur if the security of * the previous token had been compromised. Note that this is called when the * FCM registration token is initially generated so this is where you would retrieve the token. */ override fun onNewToken(token: String) { Log.d(TAG, "Refreshed token: $token") // If you want to send messages to this application instance or // manage this apps subscriptions on the server side, send the // FCM registration token to your app server. sendRegistrationToServer(token) }
Java
/** * There are two scenarios when onNewToken is called: * 1) When a new token is generated on initial app startup * 2) Whenever an existing token is changed * Under #2, there are three scenarios when the existing token is changed: * A) App is restored to a new device * B) User uninstalls/reinstalls the app * C) User clears app data */ @Override public void onNewToken(@NonNull String token) { Log.d(TAG, "Refreshed token: " + token); // If you want to send messages to this application instance or // manage this apps subscriptions on the server side, send the // FCM registration token to your app server. sendRegistrationToServer(token); }
Po uzyskaniu tokena możesz go wysłać na serwer aplikacji i zapisać go wybraną metodą.
Sprawdzanie, czy masz Usługi Google Play
Aplikacje, które korzystają z pakietu SDK Usług Play, powinny zawsze sprawdzać, czy na urządzeniu jest zainstalowany zgodny plik APK usług Google Play, zanim uzyskają dostęp do funkcji usług Google Play. Więcej informacji znajdziesz w artykule Konfigurowanie usług Google Play. Zalecamy wykonanie tej czynności w 2 miejscach: w metodzie onCreate() głównej aktywności i w jej metodzie onResume(). Sprawdzanie w onCreate() zapewnia, że nie można używać aplikacji bez pomyślnego sprawdzenia. Sprawdzenie w onResume() zapewnia, że jeśli użytkownik wróci do uruchomionej aplikacji w inny sposób, np. za pomocą przycisku Wstecz, sprawdzenie zostanie wykonane.
Jeśli na urządzeniu nie ma zgodnej wersji Usług Google Play, aplikacja może wywołać GoogleApiAvailability.makeGooglePlayServicesAvailable(), aby umożliwić użytkownikom pobranie Usług Google Play ze Sklepu Play.
Zapobieganie automatycznej inicjalizacji
Gdy generowana jest rejestracja FCM, biblioteka przesyła identyfikator i dane konfiguracyjne do Firebase. Jeśli chcesz zapobiec automatycznej rejestracji, wyłącz zbieranie danych Analytics i automatyczną inicjację FCM (musisz wyłączyć obie te funkcje), dodając te wartości metadanych do pliku AndroidManifest.xml:
<meta-data android:name="firebase_messaging_auto_init_enabled" android:value="false" /> <meta-data android:name="firebase_analytics_collection_enabled" android:value="false" />
Ponowne włączenie automatycznej inicjalizacji
Aby ponownie włączyć automatyczną inicjację FCM, wykonaj wywołanie w czasie działania:
Kotlin
Firebase.messaging.isAutoInitEnabled = true
Java
FirebaseMessaging.getInstance().setAutoInitEnabled(true);
Aby ponownie włączyć zbieranie danych Analytics, wywołaj metodę
setAnalyticsCollectionEnabled()
klasy FirebaseAnalytics. Przykład:
setAnalyticsCollectionEnabled(true);
Po ustawieniu te wartości są zachowywane po ponownym uruchomieniu aplikacji.
Wysyłanie wiadomości z powiadomieniem
Aby mieć pewność, że klient Androida jest prawidłowo skonfigurowany, możesz wysłać testową wiadomość z powiadomieniem, postępując zgodnie z tymi instrukcjami:
Zainstaluj i uruchom aplikację na urządzeniu docelowym.
Sprawdź, czy aplikacja działa w tle na urządzeniu.
W konsoli Firebase otwórz DevOps i zaangażowanie > Wiadomości.
Utwórz kampanię.
Jeśli to Twoja pierwsza wiadomość:
Kliknij Utwórz pierwszą kampanię.
Wybierz Wiadomości z powiadomieniami Firebase i kliknij Utwórz.
Jeśli masz już utworzone kampanie:
Na karcie Kampanie kliknij Nowa kampania.
Kliknij Powiadomienia.
Wpisz tekst wiadomości. Wszystkie pozostałe pola są opcjonalne.
W panelu po prawej stronie kliknij Wyślij wiadomość testową.
W polu Dodaj token rejestracji FCM wpisz token rejestracji uzyskany w poprzedniej sekcji tego przewodnika.
Kliknij Przetestuj.
Docelowe urządzenie klienta z aplikacją działającą w tle powinno otrzymać powiadomienie.
Aby uzyskać wgląd w dostarczanie wiadomości do aplikacji, otwórz panel DevOps i zaangażowanie > Wiadomości > Raporty w Firebase konsoli. Ten panel rejestruje liczbę wysłanych i otwartych wiadomości na urządzeniach z Androidem i Apple, a także dane dotyczące „wyświetleń” (powiadomień widzianych przez użytkowników) w przypadku aplikacji na Androida.
Dalsze kroki
Po wykonaniu czynności konfiguracyjnych możesz skorzystać z tych opcji, aby zacząć korzystać z FCM na Androidzie:
- Wysyłanie wiadomości na urządzenia
- Odbieranie wiadomości w aplikacji na Androida
- Wysyłanie wiadomości do tematów