webentwicklung-frage-antwort-db.com.de

FCM: onNewToken vs FirebaseInstanceId

Firebase hat einige der Messaging-Aufrufe in der Version com.google.firebase:firebase-messaging:17.1.0 veraltet. Diese Post geht diese Änderungen gut über. 

Frage: Kann mir jemand sagen, ob es als schlechte Praxis gilt, onNewToken nicht zu implementieren und stattdessen einfach den untenstehenden Block bei jedem App-Start aufzurufen. Dies erscheint Android-Leuten wahrscheinlich übertrieben, fühlt sich aber aus iOS-Sicht wie zu Hause an.

FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener(this) { instanceIdResult ->
    // Just use this call 
    val newToken = instanceIdResult.token
    Log.i("newToken", newToken)
}



@Override
public void onNewToken(String s) {
    super.onNewToken(s);
    // Leave this unimplemented
}

Ich bin eher mit iOS vertraut, das onNewToken beim Start von every App aufruft. Für iOS habe ich daher Logik gesetzt, um festzustellen, ob mein Backend aktualisiert werden muss.

getInstanceId () docs sagen This generates an Instance ID if it does not exist yet, which starts periodically sending information to the Firebase backend. Dies lässt mich davon ausgehen, dass ich bei jedem Start einfach FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener aufrufen kann.

3
kev

Vor allem bin ich sehr skeptisch gegenüber jeglicher Logik, die besagt, dass, wenn etwas in iOS in Ordnung ist, dies auf Android in Ordnung wäre!

Die Implementierung von Push-Messaging zwischen Android und iOS ist sehr unterschiedlich. Bei Android ist es von Play Services abhängig, die in einem anderen Prozess ausgeführt werden. Unter iOS ist es etwas völlig anderes. Die Regeln des Engagements sind einfach nicht gleich.

Beachten Sie, dass die empfohlene Methode zum Abrufen von Token über den Rückruf erfolgt. Dies legt nahe, dass die Token-Generierung im Wesentlichen asynchron ist. Mit anderen Worten: Beim Start der App (wie auch immer Sie das definieren), wird der Hintergrund, der das Token verwaltet, möglicherweise noch nicht erledigt. Wenn Sie danach fragen, ist möglicherweise kein Token verfügbar. Und wer weiß, wie lange das dauert? Es ist besser, wenn Sie nur das Token akzeptieren, wenn das System Ihnen sagt, dass es bereit ist, anstatt zu raten, wann es fertig ist. Folgen Sie dem empfohlenen Implementierungspfad.

6
Doug Stevenson

Etwas sehr Wichtiges, das noch niemand erwähnt hat:

Wenn Sie erst nach dem Start der App nach dem aktuellen Geräte-Token suchen, kann es sein, dass Sie das Ereignis verlieren, dass das Token aktualisiert wird, während sich Ihre App im Hintergrund befindet (natürlich) und Sie keine Remote-Push-Nachrichten von Ihrem Server empfangen können bis der Benutzer die App erneut startet und Sie das neue Token an den Server senden.

Der gesamte Zweck dieses Rückrufs, der auch aufgerufen werden kann, während sich Ihre App im Hintergrund befindet, besteht darin, zu verhindern, dass Back-End-Nachrichten verloren gehen (wichtig, wenn Ihre App oder einige wichtige Funktionen davon stark von Push-Benachrichtigungen abhängen). Es ist wichtig zu wissen, dass dieser Rückruf Ihnen nicht nur den Token liefert, wenn Sie das Gerät zum ersten Mal registrieren, sondern auch : Called if InstanceID token is updated. This may occur if the security of the previous token had been compromised.

Damit:

Kann mir jemand sagen, ob es als schlechte Praxis angesehen wird, onNewToken nicht zu implementieren und stattdessen bei jedem App-Start den folgenden Block aufzurufen? Dies scheint für Android Leute wahrscheinlich übertrieben, fühlt sich jedoch aus iOS-Sicht wie zu Hause.

Ja, es ist eine schlechte Praxis, onNewToken () nicht zu implementieren.

Obwohl die Dokumentation besagt, dass onNewToken beim ersten Start der App aufgerufen wird, ist dies nicht der Fall. Deshalb verwende ich FirebaseInstanceId bzw. getToken(), wenn ich die Id benötige, während onNewToken noch nicht aufgerufen wurde, obwohl die App bereits eine Weile läuft. (Also machen wir beides in unserem Projekt) 

Ich stelle fest, dass Firebase kurz nach dem Abrufen des Tokens über onNewTokenFirebaseInstanceId anruft. Es scheint, dass das Abrufen des Tokens auf diese Weise etwas innerhalb des Firebase-Dienstes initiiert. 

Es funktioniert jedoch so und das ist gut genug für unser aktuelles Projekt.

Edit: Da getToken() von FirebaseInstanceId in letzter Zeit veraltet ist, verweisen wir auf die Antwort von Arthur Thompson. 

4
Hermann Klecker

Das Aufrufen von FirebaseInstanceId.getInstance().getInstanceId().addOnCompleteListener bei jedem Start einer App ist eine Option (eine unnötige Option). onNewToken dient speziell dazu, Ihnen den Zugriff auf das Token zu ermöglichen, sofern verfügbar.

Beachten Sie, dass Sie beim Aufruf von FirebaseInstanceId.getInstance().getInstanceId().addOnCompleteListener bei jedem Start einer App den Fall bearbeiten müssen, für den das Token noch nicht verfügbar ist. Verwenden Sie onNewToken, um dies zu vermeiden.

1
Arthur Thompson

Die Funktion onNewToken() arbeitet wie ihr Vorgänger onTokenRefresh().

Implementieren Sie den ersten Block in Ihren Post-Requests und warten Sie auf ein Token. Dies garantiert, dass ein Token (oder eine Ausnahme) zurückgegeben wird. Es ist jedoch nicht garantiert, dass dieses Token für immer gleich bleibt. Ähnlich wie bei onTokenRefresh() wird onNewToken() ausgelöst, wenn ein Token für die entsprechende App-Instanz generiert wird, das Sie wiederum verwenden und durch das alte Token ersetzen sollten, das Sie erhalten haben.

Meine Antwort hier hat mehr Details.

0
AL.