Konfigurowanie aplikacji klienckiej Komunikacji w chmurze Firebase (FCM) na Androidzie

Klienty FCM wymagają urządzeń z Androidem 4.4 lub nowszym, na których jest zainstalowana aplikacja Sklep Google Play, lub emulatora z Androidem 4.4 z interfejsami API Google. Pamiętaj, że możesz wdrażać aplikacje na Androida za pomocą Sklepu Google Play.

Konfigurowanie pakietu SDK

W tej sekcji znajdują się zadania, które mogły zostać wykonane, jeśli masz już włączone inne funkcje Firebase w swojej aplikacji. Dodaj Firebase do swojego projektu Androida, chyba że już masz to za sobą.

Edytuj plik manifestu aplikacji

Dodaj do pliku manifestu aplikacji:

  • Usługa przedłużona o FirebaseMessagingService. Jest to wymagane, jeśli chcesz obsługiwać wiadomości inne niż odbieranie powiadomień z aplikacji w tle. Musisz rozszerzyć tę usługę, aby odbierać powiadomienia w aplikacjach działających na pierwszym planie, otrzymywać ładunki danych, wysyłać wiadomości nadrzędne itd.
  • <service
        android:name=".java.MyFirebaseMessagingService"
        android:exported="false">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>
  • (Opcjonalnie) W komponencie aplikacji dodaj elementy metadanych ustawiające domyślną ikonę i kolor powiadomień. Android używa tych wartości, gdy wiadomości przychodzące nie mają ustawionej ikony lub koloru.
  • <!-- 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" />
  • (Opcjonalnie) W Androidzie 8.0 (poziom interfejsu API 26) i nowszych kanały powiadomień są obsługiwane i zalecane. FCM zapewnia domyślny kanał powiadomień z podstawowymi ustawieniami. Jeśli wolisz utworzyć i używać własnego kanału domyślnego, ustaw default_notification_channel_id na identyfikator obiektu kanału powiadomień, jak pokazano poniżej. FCM będzie używać tej wartości za każdym razem, gdy wiadomości przychodzące nie mają wyraźnie ustawionego kanału powiadomień. Więcej informacji znajdziesz w artykule o zarządzaniu kanałami powiadomień.
  • <meta-data
        android:name="com.google.firebase.messaging.default_notification_channel_id"
        android:value="@string/default_notification_channel_id" />

Wysyłanie prośby o zgodę na wyświetlanie powiadomień w czasie działania na Androidzie 13 lub nowszym

W Androidzie 13 wprowadzono nowe uprawnienia w czasie działania dotyczące wyświetlania powiadomień. Dotyczy to wszystkich aplikacji na Androida w wersji 13 lub nowszej, które korzystają z powiadomień FCM.

Domyślnie pakiet SDK FCM (w wersji 23.0.6 lub nowszej) zawiera uprawnienie POST_NOTIFICATIONS zdefiniowane w pliku manifestu. Aplikacja musi jednak również zażądać wersji środowiska wykonawczego tego uprawnienia za pomocą stałej android.permission.POST_NOTIFICATIONS. Twoja aplikacja nie będzie mogła wyświetlać powiadomień, dopóki użytkownik nie przyzna tego uprawnienia.

Aby poprosić o nowe uprawnienia w czasie działania:

Kotlin+KTX

// 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);
        }
    }
}

Ogólnie rzecz biorąc, powinien wyświetlać się interfejs z objaśnieniem funkcji, które zostaną włączone, jeśli przyznają aplikacji uprawnienia do publikowania powiadomień. Ten interfejs powinien udostępniać opcje wyrażenia zgody lub odmowy, na przykład OK i Nie, dziękuję. Jeśli użytkownik wybierze OK, poproś o uprawnienia bezpośrednio. Jeśli użytkownik wybierze Nie, dziękuję, pozwól mu przejść dalej bez powiadomień.

Więcej sprawdzonych metod dotyczących tego, kiedy aplikacja powinna prosić użytkownika o przyznanie uprawnienia POST_NOTIFICATIONS, znajdziesz w artykule Uprawnienia czasu działania powiadomień.

Uprawnienia do wyświetlania powiadomień w aplikacjach kierowanych na Androida 12L (poziom API 32) lub niższy

Jeśli aplikacja działa na pierwszym planie, Android automatycznie prosi użytkownika o pozwolenie za pierwszym razem, gdy utworzy kanał powiadomień. Istnieją jednak ważne zastrzeżenia dotyczące czasu utworzenia kanału i prośby o przyznanie uprawnień:

  • Jeśli aplikacja tworzy swój pierwszy kanał powiadomień, gdy działa w tle (co robi pakiet SDK FCM po otrzymaniu powiadomienia FCM), Android nie pozwoli na wyświetlenie tego powiadomienia i nie poprosi użytkownika o zgodę na wyświetlanie powiadomień do czasu kolejnego uruchomienia aplikacji. Oznacza to, że wszystkie powiadomienia otrzymane przed otwarciem aplikacji i zaakceptowaniem przez użytkownika uprawnień zostaną utracone.
  • Zdecydowanie zalecamy zaktualizowanie aplikacji tak, aby była kierowana na Androida 13 lub nowszego. Pozwoli to korzystać z interfejsów API platformy do wysyłania próśb o zgodę. Jeśli nie jest to możliwe, aplikacja powinna utworzyć kanały powiadomień przed wysłaniem jakichkolwiek powiadomień, aby uruchomić okno uprawnień do powiadomień i zapobiec utracie powiadomień. Więcej informacji znajdziesz w artykule o sprawdzonych metodach uzyskiwania 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 powiadomień (przez powiadomienia FCM, innego pakietu SDK lub bezpośrednio przez aplikację) i nie chcesz, aby to uprawnienie było uwzględniane, możesz je usunąć za pomocą znacznika łączenia plików manifestu remove. Pamiętaj, że usunięcie tych uprawnień uniemożliwi wyświetlanie wszystkich powiadomień, nie tylko powiadomień z FCM. Dodaj następujący kod do pliku manifestu aplikacji:

<uses-permission android:name="android.permission.POST_NOTIFICATIONS" tools:node="remove"/>

Dostęp do tokena rejestracji urządzenia

Przy pierwszym uruchomieniu aplikacji pakiet SDK FCM generuje token rejestracji dla instancji aplikacji klienckiej. Jeśli chcesz kierować reklamy na pojedyncze urządzenia lub utworzyć grupy urządzeń, musisz uzyskać dostęp do tego tokena, rozszerzając zakres FirebaseMessagingService i zastępując onNewToken.

W tej sekcji dowiesz się, jak pobrać token i monitorować jego zmiany. Ponieważ po pierwszym uruchomieniu token może być rotowany, zdecydowanie zalecamy pobranie najnowszego zaktualizowanego tokena rejestracji.

Token rejestracji może się zmienić, gdy:

  • Aplikacja została przywrócona na nowym urządzeniu
  • Użytkownik odinstaluje lub ponownie zainstaluje aplikację.
  • Użytkownik usuwa dane aplikacji.

Pobieranie bieżącego tokena rejestracji

Gdy musisz pobrać bieżący token, wywołaj FirebaseMessaging.getInstance().getToken():

Kotlin+KTX

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+KTX

/**
 * 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 wysłać go na serwer aplikacji i zapisać, używając wybranej metody.

Sprawdź Usługi Google Play

Aplikacje, które korzystają z pakietu SDK Usług Google Play, przed uzyskaniem dostępu do funkcji Usług Google Play powinny zawsze sprawdzić, czy na urządzeniu jest zgodny plik APK Usług Google Play. Zalecamy robić to w 2 miejscach: w metodzie onCreate() głównej aktywności oraz w metodzie onResume(). Kontrola onCreate() daje pewność, że aplikacji nie można używać bez przeprowadzenia jej weryfikacji. Kontrola onResume() daje pewność, że jeśli użytkownik wróci do uruchomionej aplikacji w inny sposób, na przykład za pomocą przycisku Wstecz, kontrola zostanie przeprowadzona.

Jeśli na urządzeniu nie ma zgodnej wersji Usług Google Play, aplikacja może wywołać metodę GoogleApiAvailability.makeGooglePlayServicesAvailable(), aby umożliwić użytkownikom pobieranie Usług Google Play ze Sklepu Play.

Zapobiegaj automatycznemu inicjowaniu

Po wygenerowaniu tokena rejestracji FCM biblioteka przesyła do Firebase identyfikator i dane konfiguracji. Jeśli chcesz zapobiec automatycznemu generowaniu tokenów, wyłącz zbieranie danych przez Analytics i automatyczne inicjowanie FCM (musisz wyłączyć oba te elementy), dodając do elementu AndroidManifest.xml te wartości metadanych:

<meta-data
    android:name="firebase_messaging_auto_init_enabled"
    android:value="false" />
<meta-data
    android:name="firebase_analytics_collection_enabled"
    android:value="false" />

Aby ponownie włączyć automatyczne inicjowanie w FCM, wykonaj wywołanie w środowisku wykonawczym:

Kotlin+KTX

Firebase.messaging.isAutoInitEnabled = true

Java

FirebaseMessaging.getInstance().setAutoInitEnabled(true);

Aby ponownie włączyć zbieranie danych przez Analytics, wywołaj metodę setAnalyticsCollectionEnabled() klasy FirebaseAnalytics. Przykład:

setAnalyticsCollectionEnabled(true);

Po ustawieniu wartości te są zachowywane przy ponownym uruchomieniu aplikacji.

Dalsze kroki

Po skonfigurowaniu aplikacji klienckiej możesz zacząć wysyłać wiadomości do klienta za pomocą narzędzia do tworzenia powiadomień. Tę funkcję znajdziesz w przykładzie krótkiego wprowadzenia, który możesz pobrać, uruchomić i sprawdzić.

Aby dodać do aplikacji inne, bardziej zaawansowane działanie, możesz zadeklarować filtr intencji i zaimplementować aktywność odpowiadającą na wiadomości przychodzące. Szczegółowe informacje znajdziesz w przewodnikach dotyczących wysyłania wiadomości z serwera aplikacji:

Pamiętaj, że aby korzystać z tych funkcji, musisz mieć implementację serwera i prototole serwera (HTTP lub XMPP) lub implementację pakietu Admin SDK.