Check out what’s new from Firebase at Google I/O 2022. Learn more

Configura un'app client Firebase Cloud Messaging su Android

I client FCM richiedono dispositivi con Android 4.4 o versioni successive su cui è installata anche l'app Google Play Store o un emulatore con Android 4.4 con API di Google. Tieni presente che non sei limitato a distribuire le tue app Android tramite Google Play Store.

Configura l'SDK

Questa sezione copre le attività che potresti aver completato se hai già abilitato altre funzionalità di Firebase per la tua app. Se non l'hai già fatto, aggiungi Firebase al tuo progetto Android

Modifica il manifest dell'app

Aggiungi quanto segue al manifest della tua app:

  • Un servizio che estende FirebaseMessagingService . Questo è necessario se vuoi gestire qualsiasi messaggio oltre a ricevere notifiche sulle app in background. Per ricevere notifiche nelle app in primo piano, per ricevere il payload dei dati, per inviare messaggi a monte e così via, devi estendere questo servizio.
  • <service
        android:name=".java.MyFirebaseMessagingService"
        android:exported="false">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>
  • (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.
  • <!-- 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" />
  • (Facoltativo) 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 le 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 ulteriori informazioni, consulta Gestire i canali di notifica .
  • <meta-data
        android:name="com.google.firebase.messaging.default_notification_channel_id"
        android:value="@string/default_notification_channel_id" />

Accedi 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 desideri scegliere come target dispositivi singoli o creare gruppi di dispositivi, dovrai accedere a questo token estendendo FirebaseMessagingService e sovrascrivendo onNewToken .

Questa sezione descrive come recuperare il token e come monitorare le modifiche al token. Poiché il token potrebbe essere ruotato dopo l'avvio iniziale, si consiglia 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.

Recupera il token di registrazione corrente

Quando devi recuperare il token corrente, chiama FirebaseMessaging.getInstance().getToken() :

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

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()
})

Monitora la generazione di token

Il callback onNewToken ogni volta che viene generato un nuovo 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(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);
}

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

Dopo aver ottenuto il token, puoi inviarlo al server dell'app e archiviarlo utilizzando il tuo metodo preferito.

Verifica i servizi di Google Play

Le app che si basano su Play Services SDK dovrebbero sempre controllare il dispositivo per un APK dei servizi Google Play compatibile prima di accedere alle funzioni dei servizi di Google Play. Si consiglia di farlo in due posizioni: nel metodo onCreate() dell'attività principale e nel metodo onResume() . Il check-in onCreate() assicura che l'app non possa essere utilizzata senza un controllo riuscito. Il check-in onResume() assicura che se l'utente torna all'app in esecuzione con altri mezzi, ad esempio tramite il pulsante Indietro, il controllo viene comunque eseguito.

Se il dispositivo non dispone di una versione compatibile dei servizi di Google Play, la tua app può chiamare GoogleApiAvailability.makeGooglePlayServicesAvailable() per consentire agli utenti di scaricare i servizi di Google Play 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, disabilita la raccolta di Analytics e l'inizializzazione automatica di FCM (devi disabilitarle entrambe) aggiungendo questi valori di 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'auto-init di FCM, effettuare una chiamata di runtime:

Java

FirebaseMessaging.getInstance().setAutoInitEnabled(true);

Kotlin+KTX

Firebase.messaging.isAutoInitEnabled = true

Per riattivare la raccolta di Analytics, chiama il metodo setAnalyticsCollectionEnabled() della classe FirebaseAnalytics . Per esempio:

setAnalyticsCollectionEnabled(true);

Questi valori persistono tra i riavvii dell'app una volta impostati.

Prossimi passi

Dopo aver configurato l'app client, sei pronto per iniziare a inviare messaggi a valle con Notifications composer . Questa funzionalità è illustrata nell'esempio di avvio rapido , che puoi scaricare, eseguire ed esaminare.

Per aggiungere un altro comportamento più avanzato alla tua app, puoi dichiarare un filtro di intenti e implementare un'attività per rispondere ai messaggi in arrivo. Per i dettagli, consulta le guide per l'invio di messaggi da un server app:

Tieni presente che, per sfruttare queste funzionalità, avrai bisogno di un'implementazione del server e dei protocolli del server (HTTP o XMPP) o di un'implementazione di Admin SDK .