I client FCM richiedono dispositivi con Android 5.0 o versioni successive su cui sia installata anche l'app Google Play Store oppure un emulatore con Android 5.0 e le API di Google. Tieni presente che non sei limitato all'implementazione delle tue app per Android tramite Google Play Store.
Configura l'SDK
Questa sezione descrive le attività che potresti aver completato se hai già attivato altre funzionalità di Firebase per la tua app. Se non l'hai ancora fatto, aggiungi Firebase al tuo progetto Android
Modificare il manifest dell'app
Aggiungi quanto segue al manifest della tua app:
- Un servizio che estende
FirebaseMessagingService
. Questa autorizzazione è obbligatoria se vuoi gestire i messaggi oltre a ricevere notifiche sulle app in background. Per ricevere notifiche nelle app in primo piano, per ricevere payload di dati e così via, devi estendere questo servizio. - (Facoltativo) All'interno del componente dell'applicazione, elementi di metadati per impostare un'icona e un colore di notifica predefiniti. Android utilizza questi valori ogni volta che i messaggi in arrivo non impostano esplicitamente l'icona o il colore.
- (Facoltativo) A partire da Android 8.0 (livello API 26) e versioni successive,
i canali di notifica sono supportati e consigliati. FCM fornisce un canale di notifica predefinito
con impostazioni di base. Se preferisci
creare e utilizzare il tuo canale predefinito,
imposta
default_notification_channel_id
sull'ID del tuo oggetto canale di notifica come mostrato; FCM utilizzerà questo valore ogni volta che i messaggi in arrivo non impostano esplicitamente un canale di notifica. Per scoprire di più, consulta Gestire i canali di notifica.
<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" />
Richiedere l'autorizzazione di runtime per le notifiche su Android 13 e versioni successive
Android 13 introduce una nuova autorizzazione di runtime per la visualizzazione delle notifiche. Questa modifica interessa tutte le app in esecuzione su Android 13 o versioni successive che utilizzano le notifiche FCM.
Per impostazione predefinita, l'SDK FCM (versione 23.0.6 o successive) include l'autorizzazione
POST_NOTIFICATIONS
definita nel manifest.
Tuttavia, la tua app dovrà richiedere anche la versione di runtime di questa
autorizzazione tramite la costante android.permission.POST_NOTIFICATIONS
.
La tua app non potrà mostrare notifiche finché
l'utente non avrà concesso questa autorizzazione.
Per richiedere la nuova autorizzazione runtime:
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); } } }
In genere, dovresti mostrare una UI che spieghi all'utente le funzionalità che verranno attivate se concede le autorizzazioni all' app per pubblicare notifiche. Questa UI deve fornire all'utente le opzioni per accettare o rifiutare, ad esempio i pulsanti Ok e No, grazie. Se l'utente seleziona Ok, richiedi direttamente l'autorizzazione. Se l'utente seleziona No, grazie, consentigli di continuare senza notifiche.
Consulta la sezione Autorizzazione di runtime per le notifiche
per ulteriori best practice su quando la tua app deve richiedere l'autorizzazione
POST_NOTIFICATIONS
all'utente.
Autorizzazioni di notifica per le app che hanno come target Android 12L (livello API 32) o versioni precedenti
Android chiede automaticamente all'utente l'autorizzazione la prima volta che la tua app crea un canale di notifica, a condizione che l'app sia in primo piano. Tuttavia, esistono importanti avvertenze in merito alle tempistiche di creazione del canale e alle richieste di autorizzazione:
- Se la tua app crea il suo primo canale di notifica quando è in esecuzione in background (cosa che l'SDK FCM fa quando riceve una notifica FCM), Android non consentirà la visualizzazione della notifica e non chiederà all'utente l'autorizzazione per le notifiche fino alla successiva apertura dell'app. Ciò significa che tutte le notifiche ricevute prima dell'apertura dell'app e dell'accettazione dell'autorizzazione da parte dell'utente andranno perse.
- Ti consigliamo vivamente di aggiornare la tua app in modo che abbia come target Android 13 o versioni successive per sfruttare le API della piattaforma per richiedere l'autorizzazione. Se non è possibile, la tua app deve creare canali di notifica prima di inviare notifiche all'app per attivare la finestra di dialogo dell'autorizzazione di notifica e garantire che nessuna notifica venga persa. Per saperne di più, consulta le best practice per l'autorizzazione delle notifiche.
(Facoltativo) Rimuovi l'autorizzazione POST_NOTIFICATIONS
Per impostazione predefinita, l'SDK FCM include l'autorizzazione POST_NOTIFICATIONS
.
Se la tua app non utilizza messaggi di notifica (tramite notifiche FCM, tramite un altro SDK o pubblicati direttamente dalla tua app) e non vuoi che la tua app includa l'autorizzazione, puoi rimuoverla utilizzando il marcatore remove
dell'unione del manifest. Tieni presente che la rimozione di questa autorizzazione impedisce la visualizzazione
di tutte le notifiche, non solo di quelle FCM. Aggiungi quanto segue al file manifest della tua app:
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" tools:node="remove"/>
Accedere al token di registrazione del dispositivo
All'avvio iniziale dell'app, l'SDK FCM genera un token di registrazione per l'istanza dell'app client. Se vuoi scegliere come target singoli dispositivi o
creare gruppi di dispositivi, dovrai accedere a questo token estendendo
FirebaseMessagingService
e sostituendo onNewToken
.
Questa sezione descrive come recuperare il token e come monitorare le modifiche apportate. Poiché il token potrebbe essere ruotato dopo l'avvio iniziale, ti consigliamo vivamente di recuperare l'ultimo token di registrazione aggiornato.
Il token di registrazione può cambiare quando:
- L'app viene ripristinata su un nuovo dispositivo
- L'utente disinstalla/reinstalla l'app
- L'utente cancella i dati dell'app.
Recuperare il token di registrazione attuale
Quando devi recuperare il token attuale, chiama
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(); } });
Monitorare la generazione di token
Il callback onNewToken
viene attivato ogni volta che viene generato un nuovo 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); }
Dopo aver ottenuto il token, puoi inviarlo al server dell'app e memorizzarlo utilizzando il metodo che preferisci.
Controllare Google Play Services
Le app che si basano sull'SDK Play Services
devono sempre controllare se sul dispositivo è presente un APK di Google Play Services compatibile prima di
accedere alle funzionalità di Google Play Services. Ti consigliamo di farlo in
due posizioni: nel metodo onCreate()
dell'attività principale e nel metodo
onResume()
. Il controllo in onCreate()
garantisce che l'app
non possa essere utilizzata senza un controllo riuscito. Il controllo in onResume()
garantisce
che, se l'utente torna all'app in esecuzione in altro modo, ad esempio
tramite il pulsante Indietro, il controllo venga comunque eseguito.
Se il dispositivo non dispone di una versione compatibile di Google Play Services, la tua app può chiamare
GoogleApiAvailability.makeGooglePlayServicesAvailable()
per consentire agli utenti di scaricare Google Play Services dal Play Store.
Impedisci l'inizializzazione automatica
Quando viene generato un token di registrazione FCM, la libreria carica
l'identificatore e i dati di configurazione su
Firebase. Se preferisci impedire la generazione automatica dei token, disattiva la raccolta di Analytics e
l'inizializzazione automatica di FCM (devi disattivarle entrambe) aggiungendo questi valori dei metadati al tuo
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" />
Per riattivare l'inizializzazione automatica di FCM, effettua una chiamata di runtime:
Kotlin
Firebase.messaging.isAutoInitEnabled = true
Java
FirebaseMessaging.getInstance().setAutoInitEnabled(true);
Per riattivare la raccolta di Analytics, chiama il metodo
setAnalyticsCollectionEnabled()
della classe FirebaseAnalytics
. Ad esempio:
setAnalyticsCollectionEnabled(true);
Una volta impostati, questi valori rimangono invariati anche dopo il riavvio dell'app.
Passaggi successivi
Dopo aver configurato l'app client, puoi iniziare a inviare messaggi downstream con il composer di notifiche. Questa funzionalità è dimostrata nell'esempio di guida rapida, che puoi scaricare, eseguire e rivedere.
Per aggiungere un comportamento più avanzato alla tua app, puoi dichiarare un filtro per intent e implementare un'attività per rispondere ai messaggi in arrivo. Per maggiori dettagli, consulta le guide per l'invio di messaggi da un server app:
Tieni presente che, per usufruire di queste funzionalità, devi disporre di un' implementazione server e dei protocolli server (HTTP o XMPP) o di un'implementazione dell'SDK Admin.