Ich migriere meine App von GCM zu FCM.
Wenn ein neuer Benutzer meine App installiert, onTokenRefresh()
wird die automatisch aufgerufen. Das Problem ist, dass der Benutzer noch nicht angemeldet ist (keine Benutzer-ID).
Wie kann ich das auslösen, onTokenRefresh()
nachdem der Benutzer angemeldet ist?
android
firebase-cloud-messaging
TareK Khoury
quelle
quelle
Antworten:
Die
onTokenRefresh()
Methode wird immer dann aufgerufen, wenn ein neues Token generiert wird. Bei der Installation der App wird sie sofort generiert (wie Sie festgestellt haben). Es wird auch aufgerufen, wenn sich das Token geändert hat.Nach dem
FirebaseCloudMessaging
Leitfaden:Dies bedeutet, dass die Token-Registrierung pro App erfolgt. Es hört sich so an, als ob Sie das Token verwenden möchten, nachdem ein Benutzer angemeldet ist. Ich würde vorschlagen, dass Sie das Token in der
onTokenRefresh()
Methode im internen Speicher oder in gemeinsam genutzten Einstellungen speichern. Rufen Sie dann das Token aus dem Speicher ab, nachdem sich ein Benutzer angemeldet hat, und registrieren Sie das Token nach Bedarf bei Ihrem Server.Wenn Sie das manuell erzwingen möchten
onTokenRefresh()
, können Sie einen IntentService erstellen und die Token-Instanz löschen. Wenn Sie dann getToken aufrufen, wird dieonTokenRefresh()
Methode erneut aufgerufen.Beispielcode:
BEARBEITEN
onTokenRefresh () ist veraltet . Verwenden Sie
onNewToken()
inMyFirebaseMessagingService
quelle
Versuchen Sie zu implementieren
FirebaseInstanceIdService
, um ein Aktualisierungstoken zu erhalten.Greifen Sie auf das Registrierungstoken zu:
Sie können auf den Wert des Tokens zugreifen, indem Sie FirebaseInstanceIdService erweitern . Stellen Sie sicher, dass Sie den Dienst zu Ihrem Manifest hinzugefügt haben , rufen Sie dann
getToken
im Kontext von aufonTokenRefresh
und protokollieren Sie den Wert wie folgt:Vollständiger Code:
Siehe meine Antwort hier .
EDITS:
Sie sollten einen FirebaseInstanceIdService nicht selbst starten .
Dies wird nicht sehr häufig aufgerufen. Es wird für die Schlüsselrotation und zur Behandlung von Änderungen der Instanz-ID benötigt, und zwar aufgrund von:
Das System drosselt das Aktualisierungsereignis auf allen Geräten, um eine Überlastung der Anwendungsserver mit Token-Updates zu vermeiden.
Versuchen Sie es unten :
quelle
onTokenRefresh()
aufgerufen?Ich behalte ein Flag in der freigegebenen Voreinstellung bei, das angibt, ob ein gcm-Token an den Server gesendet wurde oder nicht. Im Begrüßungsbildschirm jedes Mal, wenn ich eine Methode sendDevicetokenToServer aufrufe. Diese Methode prüft, ob die Benutzer-ID nicht leer ist und der gcm-Sendestatus das Token an den Server sendet.
}}
In der MyFirebaseInstanceIDService-Klasse
quelle
Leute, es hat eine sehr einfache Lösung
https://developers.google.com/instance-id/guides/android-implementation#generate_a_token
Hinweis: Wenn Ihre App Token verwendet hat, die von deleteInstanceID gelöscht wurden, muss Ihre App Ersatz-Token generieren.
Anstatt die Instanz-ID zu löschen, löschen Sie nur das Token:
quelle
Dies ist in RxJava2 in einem Szenario der Fall, in dem sich ein Benutzer von Ihrer App abmeldet und andere Benutzer sich anmelden (gleiche App). Zum erneuten Starten und Anrufen der Anmeldung (Wenn das Gerät des Benutzers zum Zeitpunkt des Aktivitätsstarts keine frühere Internetverbindung hatte und wir ein Token senden müssen Login api)
Anmeldung
quelle
Diese Antwort zerstört nicht die Instanz-ID, sondern kann die aktuelle ID abrufen. Es wird auch eine aktualisierte Datei in den freigegebenen Einstellungen gespeichert.
Strings.xml
Utility.java (jede Klasse, in der Sie Einstellungen festlegen / abrufen möchten)
MyFirebaseInstanceIdService.java (erweitert FirebaseInstanceIdService)
}}
Der Dienst für Android 2.0 und höher
onCreate
wird beim automatischen Start nicht aufgerufen ( Quelle ). StattdessenonStartCommand
wird überschrieben und verwendet. Im tatsächlichen FirebaseInstanceIdService wird es jedoch als endgültig deklariert und kann nicht überschrieben werden. Wenn wir den Dienst jedoch mit startService () starten und der Dienst bereits ausgeführt wird, wird seine ursprüngliche Instanz verwendet (was gut ist). Unser onCreate () (oben definiert) wurde ebenfalls aufgerufen!.Verwenden Sie dies zu Beginn von MainActivity oder an dem Punkt, an dem Sie glauben, dass Sie eine Instanz-ID benötigen.
Und schlussendlich,
Beachten Sie, dass Sie dies weiter verbessern können, indem Sie versuchen, den Code von serviceservice () in die Methode getFirebaseInstanceId zu verschieben.
quelle
quelle
Der neue Weg, dies zu tun, wäre, die
onNewToken
Methode von zu überschreibenFirebaseMessagingService
Vergessen Sie auch nicht, den Dienst in die Manifest.xml aufzunehmen
quelle
Wie aktualisiere ich mein deviceToken?
Wenn ich mich anmelde, sende ich zuerst das erste Geräte-Token unter der Benutzersammlung und den aktuell angemeldeten Benutzer.
Danach überschreibe ich einfach
onNewToken(token:String)
meineFirebaseMessagingService()
und aktualisiere diesen Wert, wenn für diesen Benutzer ein neues Token generiert wirdJedes Mal, wenn Ihre App geöffnet wird, wird nach einem neuen Token gesucht. Wenn der Benutzer noch nicht angemeldet ist, wird das Token nicht aktualisiert. Wenn der Benutzer bereits angemeldet ist, können Sie nach einem Token suchen
newToken
quelle