Best practice per la gestione dei token di registrazione FCM

Se utilizzi le API FCM per creare richieste di invio in modo programmatico, potresti scoprire che, nel tempo, stai sprecando risorse inviando messaggi a dispositivi inattivi con token di registrazione non aggiornati. Questa situazione può influire sul messaggio di pubblicazione riportati nella console Firebase o di dati esportati in BigQuery un calo significativo (ma non valido) delle percentuali di consegna. Questo illustra alcune misure che puoi adottare per garantire un messaggio efficace targeting e rapporti di pubblicazione validi.

Token di registrazione inattivi e scaduti

I token di registrazione inattivi sono token associati a dispositivi inattivi con non connesso a FCM da oltre un mese. Con il passare del tempo, è sempre meno probabile che il dispositivo si connetta di nuovo a FCM. È improbabile che gli invii di messaggi e le suddivisioni in più argomenti per questi token non validi vengano mai eseguiti.

Esistono diversi motivi per cui un token può diventare inattivo. Ad esempio, il dispositivo al quale il token è associato potrebbe andare perso, distrutto o inserito nello spazio di archiviazione dimenticato.

Quando i token non validi raggiungono i 270 giorni di inattività, FCM li considererà token scaduti. Quando un token scade, FCM lo contrassegna come non valido e rifiuta gli invii. Tuttavia, FCM emette un nuovo token per l'istanza dell'app nel raro caso in cui il dispositivo si connetta di nuovo e l'app venga aperta.

Best practice di base

Esistono alcune pratiche fondamentali che dovresti seguire in qualsiasi app che usa FCM API per creare le richieste di invio in modo programmatico. Il migliore sono:

  • Recupera i token di registrazione da FCM e memorizzali sul tuo o server web. Un ruolo importante del server è tenere traccia dei server e mantieni un elenco aggiornato dei token attivi. Ti consigliamo vivamente di l'implementazione di un timestamp token nel codice e i server e l'aggiornamento questo timestamp a intervalli regolari.
  • Mantieni l'aggiornamento dei token e rimuovi quelli inattivi. Oltre a rimuovere i token che FCM non considera più validi, ti consigliamo di monitorare altri indicatori che indicano che i token non sono più aggiornati e rimuoverli in modo proattivo. Questa guida illustra alcune delle opzioni a tua disposizione per raggiungere questo obiettivo.

Recupera e archivia i token di registrazione

All'avvio iniziale dell'app, l'SDK FCM genera un token di registrazione per l'istanza dell'app client. Questo è il token che devi includere nelle richieste di invio mirate dall'API o aggiungere alle iscrizioni agli argomenti per il targeting degli argomenti.

Ti consigliamo vivamente di recuperare questo token all'avvio iniziale e di salvarlo al server dell'app insieme a un timestamp. Questo timestamp deve essere implementato dal tuo codice e dai tuoi server, in quanto non ti viene fornito FCM SDK.

Inoltre, è importante salvare il token sul server e aggiornare il timestamp ogni volta che cambia, ad esempio quando:

  • L'app viene ripristinata su un nuovo dispositivo
  • L'utente disinstalla o reinstalla l'app.
  • L'utente cancella i dati dell'app.
  • L'app diventa di nuovo attiva dopo la scadenza del token esistente il giorno FCM

Esempio: archivia token e timestamp in Cloud Firestore

Ad esempio, puoi utilizzare Cloud Firestore per archiviare i token in una raccolta chiamato fcmTokens. Ogni ID documento nella raccolta corrisponde un ID utente e il documento archivia il token di registrazione corrente e i relativi il timestamp dell'ultimo aggiornamento. Utilizza la funzione set come mostrato in questo esempio di Kotlin:

    /**
     * Persist token to third-party servers.
     *
     * Modify this method to associate the user's FCM registration token with any server-side account
     * maintained by your application.
     *
     * @param token The new token.
     */
    private fun sendTokenToServer(token: String?) {
        // If you're running your own server, call API to send token and today's date for the user

        // Example shown below with Firestore
        // Add token and timestamp to Firestore for this user
        val deviceToken = hashMapOf(
            "token" to token,
            "timestamp" to FieldValue.serverTimestamp(),
        )
        // Get user ID from Firebase Auth or your own server
        Firebase.firestore.collection("fcmTokens").document("myuserid")
            .set(deviceToken)
    }

Ogni volta che viene recuperato un token, questo viene archiviato in Cloud Firestore chiamando sendTokenToServer:

    /**
     * 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.
        sendTokenToServer(token)
    }
        var token = Firebase.messaging.token.await()

        // Check whether the retrieved token matches the one on your server for this user's device
        val preferences = this.getPreferences(Context.MODE_PRIVATE)
        val tokenStored = preferences.getString("deviceToken", "")
        lifecycleScope.launch {
            if (tokenStored == "" || tokenStored != token)
            {
                // If you have your own server, call API to send the above token and Date() for this user's device

                // Example shown below with Firestore
                // Add token and timestamp to Firestore for this user
                val deviceToken = hashMapOf(
                    "token" to token,
                    "timestamp" to FieldValue.serverTimestamp(),
                )

                // Get user ID from Firebase Auth or your own server
                Firebase.firestore.collection("fcmTokens").document("myuserid")
                    .set(deviceToken).await()
            }
        }

Mantieni l'aggiornamento dei token e rimuovi quelli inattivi

Determinare se un token è nuovo o inattivo non è sempre facile. A copri tutti i casi, dovresti adottare una soglia per quando prendi in considerazione i token inattivi. Per impostazione predefinita, FCM considera un token non valido se la sua istanza dell'app non si è connessa da un mese. È probabile che un token più vecchio di un mese essere un dispositivo inattivo; se un dispositivo attivo avrebbe altrimenti aggiornato di accesso.

A seconda del caso d'uso, un mese potrebbe essere troppo breve o troppo lungo, quindi sta a te determinare i criteri più adatti alle tue esigenze.

Rileva le risposte di token non valide dal backend FCM

Assicurati di rilevare le risposte con token non validi da FCM e rispondi eliminando dal tuo sistema tutti i token di registrazione noti come non validi o scaduti. Con l'API HTTP v1, questi messaggi di errore potrebbero indicare che la richiesta di invio ha come target token non validi o scaduti:

  • UNREGISTERED (HTTP 404)
  • INVALID_ARGUMENT (HTTP 400)
di Gemini Advanced.

Se sei certo che il payload dei messaggi sia valido e ricevi uno dei due queste risposte per un token mirato, puoi eliminare il tuo record di questo poiché non sarà mai più valido. Ad esempio, per eliminare token non validi da Cloud Firestore, potresti eseguire il deployment ed eseguire una funzione come la seguente:

    // Registration token comes from the client FCM SDKs
    const registrationToken = 'YOUR_REGISTRATION_TOKEN';

    const message = {
    data: {
        // Information you want to send inside of notification
    },
    token: registrationToken
    };

    // Send message to device with provided registration token
    getMessaging().send(message)
    .then((response) => {
        // Response is a message ID string.
    })
    .catch((error) => {
        // Delete token for user if error code is UNREGISTERED or INVALID_ARGUMENT.
        if (errorCode == "messaging/registration-token-not-registered") {
            // If you're running your own server, call API to delete the
            token for the user

            // Example shown below with Firestore
            // Get user ID from Firebase Auth or your own server
            Firebase.firestore.collection("fcmTokens").document(user.uid).delete()
        }
    });

FCM restituirà una risposta relativa al token non valido solo se un token è scaduto dopo 270 giorni o se un cliente ha annullato la registrazione in modo esplicito. Se hai bisogno di altro monitorare accuratamente l'obsolescenza in base alle tue definizioni, puoi rimuovi i token di registrazione inattivi in modo proattivo.

Aggiornare regolarmente i token

Ti consigliamo di recuperare e aggiornare periodicamente tutti i token di registrazione sul tuo server. A questo scopo, devi:

  • Aggiungi la logica dell'app nell'app client per recuperare il token attuale utilizzando il token la chiamata API appropriata (ad esempio, token(completion): per le piattaforme Apple getToken() per Android), quindi invia il token corrente al server delle app per l'archiviazione (con timestamp). Potrebbe essere un job mensile configurato per coprire client o token.
  • Aggiungi la logica del server per aggiornare il timestamp del token a intervalli regolari. che il token sia stato modificato o meno.

Ad esempio, la logica Android per l'aggiornamento dei token utilizzando WorkManager vedi Gestione dei token di Cloud Messaging sul blog Firebase.

Qualunque sia il pattern di tempo che segui, assicurati di aggiornare periodicamente i token. Un la frequenza di aggiornamento di una volta al mese ha un buon equilibrio tra l'impatto sulla batteria e il rilevamento dei token di registrazione inattivi. Eseguendo questo aggiornamento, assicura che i dispositivi inattivi aggiornino la registrazione quando di nuovo attiva. Non è vantaggioso eseguire l'aggiornamento più spesso di una volta alla settimana.

Rimuovi i token di registrazione inattivi

Prima di inviare messaggi a un dispositivo, assicurati che il timestamp del il token di registrazione rientra nel periodo di inattività. Ad esempio, potresti implementare Cloud Functions for Firebase per eseguire un controllo giornaliero per garantire che il timestamp è compreso in un periodo definito della finestra di inattività, come const EXPIRATION_TIME = 1000 * 60 * 60 * 24 * 30;, quindi rimuovi i token inattivi:

exports.pruneTokens = functions.pubsub.schedule('every 24 hours').onRun(async (context) => {
  // Get all documents where the timestamp exceeds is not within the past month
  const staleTokensResult = await admin.firestore().collection('fcmTokens')
      .where("timestamp", "<", Date.now() - EXPIRATION_TIME)
      .get();
  // Delete devices with stale tokens
  staleTokensResult.forEach(function(doc) { doc.ref.delete(); });
});

Annulla l'iscrizione dei token obsoleti agli argomenti

Se utilizzi gli argomenti, ti consigliamo anche di annullare la registrazione dei token inattivi dagli argomenti a cui sono iscritti. Ciò prevede due passaggi:

  1. L'app dovrebbe abbonarsi nuovamente agli argomenti una volta al mese e ogni volta che modifiche al token di registrazione. Si tratta di una soluzione di riparazione automatica in cui gli abbonamenti vengono visualizzati di nuovo automaticamente quando un'app diventa di nuovo attiva.
  2. Se un'istanza di app è inattiva per un mese (o per la tua finestra di inattività), deve annullare l'iscrizione ad argomenti utilizzando SDK Admin Firebase per elimina il token alla mappatura degli argomenti dal backend FCM.

Il vantaggio di queste due fasi è che i fanout saranno più rapidi poiché ci sono meno token inattivi a cui eseguire il fan-out e le istanze di app inattive si riabbonano automaticamente quando saranno di nuovo attivi.

Misura il successo delle consegne

Per avere un quadro più preciso della consegna dei messaggi, è preferibile inviare a istanze di app utilizzate attivamente. Ciò è particolarmente importante se inviare regolarmente messaggi ad argomenti con un numero elevato di sottoscrittori; se un parte di questi abbonati sono effettivamente inattivi, l'impatto sulla le statistiche possono essere significative nel tempo.

Prima di indirizzare i messaggi a un token, considera quanto segue:

  • Google Analytics, i dati acquisiti in BigQuery o altri indicatori di monitoraggio? indicare che il token è attivo?
  • I precedenti tentativi di consegna non sono andati a buon fine regolarmente in un determinato periodo di tempo?
  • Il token di registrazione è stato aggiornato sui tuoi server nell'ultimo mese?
  • Per i dispositivi Android, l'API FCM Data segnalare un'elevata percentuale di errori di recapito dei messaggi dovuti a droppedDeviceInactive?

Per ulteriori informazioni sulla consegna, consulta Informazioni sulla consegna dei messaggi.