Best Practices für die Verwaltung von FCM-Registrierungstokens

Wenn Sie FCM-APIs verwenden, um Sendeanfragen programmatisch zu erstellen, können Sie dass Sie mit der Zeit Ressourcen vergeuden, indem Sie Nachrichten an inaktive Geräte mit veralteten Registrierungstokens Diese Situation kann sich auf die in der Firebase Console erfassten Daten zur Nachrichtenübermittlung oder auf Daten auswirken, die nach BigQuery exportiert wurden. Dies kann zu einem drastischen (aber nicht tatsächlich gültigen) Rückgang der Zustellungsraten führen. In diesem Leitfaden werden einige Maßnahmen beschrieben, mit denen Sie ein effizientes Targeting von Nachrichten und gültige Berichte zur Zustellung erreichen können.

Veraltete und abgelaufene Registrierungstokens

Veraltete Registrierungstokens sind Tokens, die mit inaktiven Geräten verknüpft sind, länger als einen Monat nicht mit FCM verbunden. Mit der Zeit nimmt die Wahrscheinlichkeit, und es ist unwahrscheinlicher, dass sich das Gerät wieder mit FCM verbindet. Nachricht und Themen-Fanouts für diese veralteten Tokens sind unwahrscheinlich. geliefert wurden.

Es gibt mehrere Gründe, warum ein Token veraltet sein kann. Beispiel: Das Gerät das Token, mit dem das Token verknüpft ist, verloren, vernichtet oder gelagert werden kann und vergessen.

Wenn bei abgelaufenen Tokens 270 Tage Inaktivität erreicht werden, werden sie von FCM als abgelaufene Tokens betrachtet. Wenn ein Token abläuft, markiert FCM es als ungültig und lehnt eingehende Nachrichten ab. FCM gibt jedoch ein neues Token für die App aus. falls das Gerät wieder eine Verbindung herstellt und die App geöffnet wird.

Grundlegende Best Practices

Es gibt einige grundlegende Vorgehensweisen, die Sie bei jeder App beachten sollten, FCM APIs zum programmatischen Erstellen von Sendeanfragen. Das Beste Best Practices:

  • Registrierungstokens von FCM abrufen und auf deinem Server speichern Eine wichtige Aufgabe des Servers besteht darin, das Token jedes Clients im Blick zu behalten und eine aktuelle Liste der aktiven Tokens zu führen. Wir empfehlen dringend, Implementieren eines Tokenzeitstempels in Ihrem Code und auf Ihren Servern sowie in regelmäßigen Intervallen.
  • Aktualisieren Sie die Tokens und entfernen Sie veraltete Tokens. Zusätzlich zu Entfernen von Tokens, die FCM nicht mehr als gültig erachtet, andere Anzeichen dafür, dass Tokens veraltet sind, überwachen und sie entfernen. proaktiv zu gestalten. In diesem Leitfaden werden einige Optionen beschrieben, wie Sie das erreichen können.

Registrierungstokens abrufen und speichern

Beim ersten Start deiner App generiert das FCM SDK eine Registrierung Token für die Client-App-Instanz. Dieses Token muss in Anfragen für gezielte Übermittlungen aus der API enthalten sein oder zu Themenabos für das Targeting auf Themen hinzugefügt werden.

Wir empfehlen dringend, dass Ihre App dieses Token beim ersten Start abrufen und speichern zusammen mit einem Zeitstempel an den Anwendungsserver übertragen. Dieser Zeitstempel muss die von Ihrem Code und Ihren Servern implementiert wurden. FCM SDKs.

Außerdem ist es wichtig, das Token auf dem Server zu speichern und den Zeitstempel zu aktualisieren, wenn sich etwas ändert, z. B. in folgenden Fällen:

  • Die App wird auf einem neuen Gerät wiederhergestellt
  • Der Nutzer deinstalliert oder installiert die App neu
  • Der Nutzer löscht App-Daten.
  • Die App wird wieder aktiviert, wenn FCM abgelaufen ist. Token

Beispiel: Tokens und Zeitstempel in Cloud Firestore speichern

Sie können beispielsweise Cloud Firestore verwenden, um Tokens in einer Sammlung zu speichern. namens fcmTokens. Jede Dokument-ID in der Sammlung entspricht eine Nutzer-ID und im Dokument werden das aktuelle Registrierungstoken und seine Zeitstempel der letzten Aktualisierung. Verwenden Sie die Funktion set, wie in diesem Kotlin-Beispiel gezeigt:

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

Jedes Mal, wenn ein Token abgerufen wird, wird es im Verzeichnis Cloud Firestore durch folgenden Aufruf gespeichert: 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()
            }
        }

Token aktuell halten und veraltete Tokens entfernen

Die Ermittlung, ob ein Token aktuell oder veraltet ist, ist nicht immer einfach. Bis alle Fälle abdecken, sollten Sie einen Grenzwert für die Berücksichtigung von Tokens festlegen. sind veraltet. Standardmäßig betrachtet FCM ein Token als veraltet, wenn seine App-Instanz seit einem Monat nicht mehr verbunden war. Bei einem Token, das älter als ein Monat ist, handelt es sich wahrscheinlich um ein inaktives Gerät. Bei einem aktiven Gerät würde das Token andernfalls aktualisiert.

Je nach Anwendungsfall kann ein Monat zu kurz oder zu lang sein. Sie müssen also selbst die Kriterien festlegen, die für Sie am besten geeignet sind.

Ungültige Tokenantworten vom FCM-Backend erkennen

Achten Sie darauf, ungültige Tokenantworten von FCM zu erkennen, und antworten Sie bis zum Löschen von Registrierungstokens, die bekanntermaßen ungültig sind, aus Ihrem System oder abgelaufen sind. Bei der HTTP v1 API können diese Fehlermeldungen darauf hinweisen, dass Ihre Sendeanfrage auf ungültige oder abgelaufene Tokens ausgerichtet war:

  • UNREGISTERED (HTTP 404)
  • INVALID_ARGUMENT (HTTP 400)

Wenn Sie sicher sind, dass die Nachrichtennutzlast gültig ist, und Sie entweder diese Antworten für ein Zieltoken zu liefern, können Sie Ihren da es nie wieder gültig sein wird. Um beispielsweise ungültige Tokens zu löschen, aus Cloud Firestore können Sie eine Funktion wie die folgende bereitstellen und ausführen:

    // 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 gibt nur dann eine ungültige Tokenantwort zurück, wenn ein Token abgelaufen ist oder wenn ein Kunde die Registrierung explizit aufgehoben hat. Wenn Sie noch mehr können Sie Veralterung mithilfe Ihrer eigenen Definitionen Entfernen Sie proaktiv veraltete Registrierungstokens.

Tokens regelmäßig aktualisieren

Wir empfehlen, alle Registrierungstokens regelmäßig abzurufen und zu aktualisieren. auf Ihrem Server. Dazu sind folgende Schritte erforderlich:

  • Fügen Sie Ihrer Clientanwendung App-Logik hinzu, um das aktuelle Token mit dem entsprechenden API-Aufruf abzurufen (z. B. token(completion): für Apple-Plattformen oder getToken() für Android) und senden Sie es dann zum Speichern (mit einem Zeitstempel) an Ihren App-Server. Dies kann ein monatlicher Job sein, der so konfiguriert ist, dass er alle Clients oder Tokens an.
  • Fügen Sie Serverlogik hinzu, um den Zeitstempel des Tokens in regelmäßigen Abständen zu aktualisieren, unabhängig davon, ob sich das Token geändert hat.

Ein Beispiel für Android-Logik zum Aktualisieren von Tokens mit WorkManager Siehe Cloud Messaging-Tokens verwalten im Firebase-Blog.

Unabhängig von Ihrem Timing-Muster sollten Sie die Tokens regelmäßig aktualisieren. Eine Die Aktualisierungshäufigkeit einmal pro Monat sorgt für ein gutes Gleichgewicht zwischen der Belastung des Akkus. und inaktive Registrierungstokens erkennen. Durch diese Aktualisierung wird auch sichergestellt, dass die Registrierung aller Geräte, die inaktiv werden, aktualisiert wird, sobald sie wieder aktiv werden. Es bringt nichts, die Aktualisierung häufiger durchzuführen. als wöchentlich.

Alte Registrierungstokens entfernen

Prüfen Sie vor dem Senden von Nachrichten an ein Gerät, ob der Zeitstempel der innerhalb des Zeitraums für die Veralterung liegt. Sie können beispielsweise Cloud Functions for Firebase implementieren, um täglich zu prüfen, ob sich der Zeitstempel innerhalb eines definierten Zeitfensters für abgelaufene Tokens wie const EXPIRATION_TIME = 1000 * 60 * 60 * 24 * 30; befindet, und dann abgelaufene Tokens entfernen:

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

Abgelaufene Tokens von Themen abmelden

Wenn Sie Themen verwenden, können Sie auch veraltete Tokens aus den Themen abmelden. die sie abonniert haben. Dies umfasst zwei Schritte:

  1. Ihre App sollte einmal pro Monat und jedes Mal, wenn die Änderung des Registrierungstokens. Dies bildet eine selbstheilende Lösung, bei der die Abos erscheinen automatisch wieder, wenn eine App wieder aktiv wird.
  2. Wenn eine App-Instanz einen Monat lang inaktiv ist (oder so lange, wie es in Ihrem eigenen Zeitfenster für die Zeitüberschreitung festgelegt ist), sollten Sie sie mit dem Firebase Admin SDK von Themen abmelden, um die Zuordnung des Tokens zum Thema aus dem FCM-Back-End zu löschen.

Der Vorteil dieser beiden Schritte besteht darin, dass Ihre Fanouts schneller stattfinden, es gibt weniger veraltete Tokens zum Ausfächern und Ihre veralteten App-Instanzen werden automatisch wieder abonnieren, sobald sie wieder aktiv sind.

Messung des Auslieferungserfolgs

Um ein möglichst genaues Bild von der Zustellung von Nachrichten zu erhalten, sollten Sie Nachrichten an aktiv verwendete App-Instanzen. Das ist besonders wichtig, wenn Sie regelmäßig Nachrichten zu Themen mit vielen Abonnenten senden wenn ein tatsächlich inaktiv sind, hat dies Auswirkungen auf Ihre Statistiken können im Laufe der Zeit signifikant sein.

Bevor Sie Nachrichten auf ein Token ausrichten, sollten Sie Folgendes berücksichtigen:

  • Werden Google Analytics, in BigQuery erfasste Daten oder andere Tracking-Signale um anzuzeigen, dass das Token aktiv ist?
  • Sind vorherige Zustellversuche über einen längeren Zeitraum regelmäßig fehlgeschlagen?
  • Wurde das Registrierungstoken auf Ihren Servern im letzten Monat aktualisiert?
  • Für Android-Geräte: Hat die FCM Data API melden einen hohen Prozentsatz an Fehlern bei der Nachrichtenzustellung aufgrund droppedDeviceInactive?

Weitere Informationen zur Auslieferung finden Sie unter Nachrichtenzustellung