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 gemeldete Lieferdaten oder nach BigQuery exportierte Daten, als drastischer (aber nicht tatsächlich gültiger) Rückgang der Auslieferungsraten zu erkennen ist. Dieses In diesem Leitfaden werden einige Maßnahmen vorgestellt, mit denen Sie für eine effiziente Kommunikation Targeting und gültige Auslieferungsberichte.
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 wird es immer unwahrscheinlicher, dass das Gerät wieder eine Verbindung zu FCM herstellen kann. 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 veraltete Tokens 270 Tage Inaktivität erreicht haben, werden sie von FCM berücksichtigt abgelaufene Tokens. Wenn ein Token abläuft, markiert FCM es als ungültig und lehnt eingehende Nachrichten ab. In seltenen Fällen, in denen das Gerät wieder eine Verbindung herstellt und die App geöffnet wird, stellt FCM jedoch ein neues Token für die App-Instanz aus.
Grundlegende Best Practices
Bei jeder App, in der FCM APIs verwendet werden, um Anfragen programmatisch zu senden, sollten Sie einige grundlegende Praktiken beachten. Das Beste Best Practices:
- Registrierungstokens von FCM abrufen und in deinem Server. Eine wichtige Rolle für den Server besteht darin, und aktualisieren Sie die Liste der aktiven Tokens. 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. Neben dem Entfernen von Tokens, die von FCM nicht mehr als gültig betrachtet werden, sollten Sie auch andere Anzeichen dafür beobachten, dass Tokens veraltet sind, und sie proaktiv entfernen. In diesem Leitfaden werden einige Optionen beschrieben, wie Sie dies 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. Dies ist das Token, das Sie in von der API gezielt senden oder Abos zu Themen hinzufügen Themen.
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, bei jeder Änderung, z. B. wenn
- 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 namens fcmTokens
zu speichern. 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. Tokens, die älter als einen Monat sind, ein inaktives Gerät sein, hätte ein aktives Gerät andernfalls die Token.
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 löschen Sie alle Registrierungstokens, die bekanntlich ungültig oder abgelaufen sind. Bei der HTTP v1-API können diese Fehlermeldungen darauf hinweisen, Ihre Sendeanfrage hat auf ungültige oder abgelaufene Tokens ausgerichtet:
UNREGISTERED
(HTTP 404)INVALID_ARGUMENT
(HTTP 400)
Wenn Sie sicher sind, dass die Nachrichtennutzlast gültig ist, und Sie eine dieser Antworten für ein Targeting-Token erhalten, können Sie den Eintrag für dieses Token löschen, da es nie wieder gültig sein wird. Wenn Sie beispielsweise ungültige Tokens aus Cloud Firestore löschen möchten, 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 mehr Ihre eigenen Definitionen verwenden, können Sie 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 Client-App Anwendungslogik hinzu, um das aktuelle Token mithilfe der
API-Aufruf (z. B.
token(completion):
für Apple-Plattformen odergetToken()
für Android) und senden Sie dann das aktuelle Token zur Speicherung an Ihren App-Server. (mit Zeitstempel). Dies kann ein monatlicher Job sein, der so konfiguriert ist, dass alle Kunden oder Tokens abgedeckt werden. - Fügen Sie eine 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 die Android-Logik zum Aktualisieren von Tokens mit WorkManager finden Sie im Firebase-Blog unter Cloud Messaging-Tokens verwalten.
Unabhängig von Ihrem Timing-Muster sollten Sie die Tokens regelmäßig aktualisieren. Eine Aktualisierungshäufigkeit von einmal im Monat bietet ein gutes Gleichgewicht zwischen Akkubelastung und Erkennung inaktiver Registrierungstokens. 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.
Veraltete Registrierungstokens entfernen
Bevor Sie Nachrichten an ein Gerät senden, prüfen Sie, ob der Zeitstempel des Registrierungstokens des Geräts innerhalb des Zeitfensters für die Gültigkeit 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, sollten Sie auch veraltete Tokens von den Themen abmelden, für die sie abonniert sind. Dazu sind zwei Schritte erforderlich:
- Ihre App sollte sich einmal pro Monat und jedes Mal neu für Themen registrieren, wenn sich das Registrierungstoken ändert. Dies ist eine selbstheilende Lösung, bei der die Abos automatisch wieder angezeigt werden, wenn eine App wieder aktiv wird.
- 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.
Erfolg der Auslieferung messen
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 an Themen mit einer großen Anzahl von Abonnenten senden. Wenn ein Teil dieser Abonnenten inaktiv ist, kann sich das im Laufe der Zeit erheblich auf Ihre Zustellungsstatistiken auswirken.
Bevor Sie Nachrichten an 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?
- Gibt die FCM Data API für Android-Geräte einen hohen Prozentsatz von Übermittlungsfehlern aufgrund von
droppedDeviceInactive
an?
Weitere Informationen zur Zustellung finden Sie unter E-Mail-Zustellung.