Skonfiguruj aplikację kliencką Firebase Cloud Messaging na Androidzie

Klienci FCM wymagają urządzeń z systemem Android 4.4 lub nowszym, na których zainstalowana jest także aplikacja Sklep Google Play lub emulator systemu Android 4.4 z interfejsami API Google. Pamiętaj, że wdrażanie aplikacji na Androida za pośrednictwem Sklepu Google Play nie jest ograniczone.

Skonfiguruj pakiet SDK

W tej sekcji omówiono zadania, które mogłeś wykonać, jeśli włączyłeś już inne funkcje Firebase w swojej aplikacji. Jeśli jeszcze tego nie zrobiłeś, dodaj Firebase do swojego projektu na Androida

Edytuj manifest aplikacji

Dodaj następujące elementy do manifestu swojej aplikacji:

  • Usługa rozszerzająca FirebaseMessagingService . Jest to wymagane, jeśli chcesz obsługiwać wiadomości poza otrzymywaniem powiadomień w aplikacjach w tle. Aby otrzymywać powiadomienia w aplikacjach na pierwszym planie, odbierać ładunek danych, wysyłać wiadomości nadrzędne itd., musisz rozszerzyć tę usługę.
  • <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 elementy metadanych umożliwiające ustawienie domyślnej ikony i koloru powiadomień. Android używa tych wartości, ilekroć przychodzące wiadomości nie mają jawnie 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) Od wersji Androida 8.0 (poziom 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; FCM użyje tej wartości za każdym razem, gdy przychodzące wiadomości nie ustawią jawnie kanału powiadomień. Aby dowiedzieć się więcej, zobacz Zarządzanie kanałami powiadomień .
  • <meta-data
        android:name="com.google.firebase.messaging.default_notification_channel_id"
        android:value="@string/default_notification_channel_id" />

Poproś o pozwolenie na powiadomienie w czasie wykonywania na Androidzie 13 lub nowszym

W Androidzie 13 wprowadzono nowe uprawnienia wykonawcze umożliwiające wyświetlanie powiadomień. Dotyczy to wszystkich aplikacji działających na Androidzie 13 lub nowszym, które korzystają z powiadomień FCM.

Domyślnie pakiet FCM SDK (wersja 23.0.6 lub nowsza) zawiera uprawnienie POST_NOTIFICATIONS zdefiniowane w manifeście. Jednak Twoja aplikacja będzie również musiała zażądać wersji tego uprawnienia w czasie wykonywania za pośrednictwem stałej android.permission.POST_NOTIFICATIONS . Twoja aplikacja nie będzie mogła wyświetlać powiadomień, dopóki użytkownik nie udzieli tego uprawnienia.

Aby poprosić o nowe pozwolenie na środowisko wykonawcze:

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, powinieneś wyświetlić interfejs użytkownika wyjaśniający użytkownikowi funkcje, które zostaną włączone, jeśli przyzna aplikacji uprawnienia do publikowania powiadomień. Ten interfejs użytkownika powinien zapewniać użytkownikowi opcje wyrażania zgody lub odmowy, takie jak przyciski OK i Nie, dziękuję . Jeśli użytkownik wybierze OK , bezpośrednio poproś o pozwolenie. Jeśli użytkownik wybierze opcję Nie, dziękuję , zezwól mu na kontynuowanie bez powiadomień.

Zobacz Uprawnienia do działania powiadomień, aby uzyskać więcej najlepszych praktyk dotyczących tego, kiedy aplikacja powinna żądać od użytkownika uprawnienia POST_NOTIFICATIONS .

Uprawnienia do powiadamiania dla aplikacji przeznaczonych na system Android 12L (poziom API 32) lub niższy

Android automatycznie pyta użytkownika o pozwolenie, gdy aplikacja po raz pierwszy tworzy kanał powiadomień, o ile aplikacja znajduje się na pierwszym planie. Istnieją jednak ważne zastrzeżenia dotyczące czasu tworzenia kanału i próśb o pozwolenie:

  • Jeśli Twoja aplikacja utworzy swój pierwszy kanał powiadomień, gdy będzie działać w tle (co robi pakiet FCM SDK po otrzymaniu powiadomienia FCM), system Android nie zezwoli na wyświetlenie powiadomienia i nie poprosi użytkownika o pozwolenie na powiadomienie aż do następnego momencie otwarcia aplikacji. Oznacza to, że wszelkie powiadomienia otrzymane przed otwarciem aplikacji i zaakceptowaniem przez użytkownika pozwolenia zostaną utracone .
  • Zdecydowanie zalecamy aktualizację aplikacji tak, aby była przeznaczona dla systemu Android 13 lub nowszego, aby móc korzystać z interfejsów API platformy i prosić o pozwolenie. Jeśli nie jest to możliwe, Twoja aplikacja powinna utworzyć kanały powiadomień przed wysłaniem jakichkolwiek powiadomień do aplikacji, aby wywołać okno dialogowe pozwolenia na powiadomienie i mieć pewność, że żadne powiadomienia nie zostaną utracone. Aby uzyskać więcej informacji, zobacz najlepsze praktyki dotyczące uprawnień do powiadomień .

Opcjonalnie: usuń uprawnienie POST_NOTIFICATIONS

Domyślnie pakiet FCM SDK zawiera uprawnienie POST_NOTIFICATIONS . Jeśli Twoja aplikacja nie korzysta z powiadomień (za pośrednictwem powiadomień FCM, innego pakietu SDK lub wysyłanych bezpośrednio przez aplikację) i nie chcesz, aby aplikacja zawierała takie uprawnienia, możesz ją usunąć, korzystając ze znacznika remove manifestu połączenia . Pamiętaj, że usunięcie tego uprawnienia uniemożliwia wyświetlanie wszystkich powiadomień, a nie tylko powiadomień FCM. Dodaj następujące elementy do pliku manifestu aplikacji:

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

Uzyskaj dostęp do tokena rejestracji urządzenia

Podczas pierwszego uruchomienia aplikacji zestaw FCM SDK generuje token rejestracji dla instancji aplikacji klienckiej. Jeśli chcesz kierować reklamy na pojedyncze urządzenia lub tworzyć grupy urządzeń, musisz uzyskać dostęp do tego tokena, rozszerzając FirebaseMessagingService i zastępując onNewToken .

W tej sekcji opisano, jak odzyskać token i jak monitorować zmiany w tokenie. Ponieważ token może zostać obrócony po pierwszym uruchomieniu, zdecydowanie zaleca się pobranie najnowszego zaktualizowanego tokena rejestracyjnego.

Token rejestracyjny może ulec zmianie w przypadku:

  • Aplikacja zostanie przywrócona na nowym urządzeniu
  • Użytkownik odinstalowuje/ponownie instaluje aplikację
  • Użytkownik czyści dane aplikacji.

Pobierz bieżący token rejestracji

Gdy chcesz odzyskać 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();
        }
    });

Monitoruj generowanie 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 tokenu możesz wysłać go na serwer aplikacji i zapisać przy użyciu preferowanej metody.

Sprawdź usługi Google Play

Aplikacje korzystające z pakietu SDK Usług Play powinny zawsze sprawdzić, czy na urządzeniu znajduje się zgodny plik APK Usług Google Play, zanim uzyskają dostęp do funkcji Usług Google Play. Zaleca się zrobić to w dwóch miejscach: w metodzie onCreate() głównego działania i w metodzie onResume() . Sprawdzenie onCreate() gwarantuje, że aplikacja nie będzie mogła być używana bez pomyślnego sprawdzenia. Funkcja onResume() gwarantuje, że jeśli użytkownik powróci do uruchomionej aplikacji w inny sposób, na przykład za pomocą przycisku Wstecz, sprawdzenie będzie nadal wykonywane.

Jeśli urządzenie nie ma kompatybilnej wersji Usług Google Play, Twoja aplikacja może wywołać GoogleApiAvailability.makeGooglePlayServicesAvailable() , aby umożliwić użytkownikom pobieranie usług Google Play ze Sklepu Play.

Zapobiegaj automatycznej inicjalizacji

Po wygenerowaniu tokenu rejestracji FCM biblioteka przesyła identyfikator i dane konfiguracyjne do Firebase. Jeśli wolisz zapobiegać automatycznemu generowaniu tokenów, wyłącz zbieranie Analytics i automatyczną inicjalizację FCM (musisz wyłączyć oba), 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" />

Aby ponownie włączyć automatyczną inicjację FCM, wykonaj wywołanie w czasie wykonywania:

Kotlin+KTX

Firebase.messaging.isAutoInitEnabled = true

Java

FirebaseMessaging.getInstance().setAutoInitEnabled(true);

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

setAnalyticsCollectionEnabled(true);

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

Następne kroki

Po skonfigurowaniu aplikacji klienckiej możesz rozpocząć wysyłanie wiadomości za pomocą narzędzia do tworzenia powiadomień . Funkcjonalność tę przedstawiono w przykładzie szybkiego startu , który można pobrać, uruchomić i przejrzeć.

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

Należy pamiętać, że aby skorzystać z tych funkcji, potrzebna jest implementacja serwera i protokoły serwera (HTTP lub XMPP) lub implementacja pakietu Admin SDK .