web-dev-qa-db-fra.com

FCM: onNewToken vs FirebaseInstanceId

Firebase a déconseillé d'utiliser certains des appels de messagerie dans la version com.google.firebase:firebase-messaging:17.1.0. Ce post reprend joliment ces changements. 

Question: Quelqu'un peut-il me dire s'il est considéré comme une mauvaise pratique de ne pas implémenter onNewToken et de simplement appeler le bloc ci-dessous au lancement de chaque application? Cela semble probablement excessif pour les utilisateurs d'Android mais se sent comme à la maison du point de vue iOS.

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
}

Je connais mieux iOS qui appelle son équivalent onNewToken au lancement de l’application {tous}. Donc, pour iOS, j'ai mis la logique là-bas pour déterminer si mon backend doit être mis à jour.

getInstanceId () docs dire This generates an Instance ID if it does not exist yet, which starts periodically sending information to the Firebase backend. Cela me fait supposer que je peux simplement appeler FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener à chaque lancement.

3
kev

Tout d'abord, je suis très sceptique quant à toute logique qui suggère que si quelque chose va bien sur iOS, ce serait bien sur Android!

La mise en œuvre de la messagerie Push entre Android et iOS est extrêmement différente. Sur Android, cela dépend de Play Services, qui s'exécute dans un autre processus. Sur iOS, c'est quelque chose de complètement différent. Les règles d'engagement ne sont tout simplement pas les mêmes.

Notez que la méthode de récupération de jeton suggérée est le rappel. Cela suggère que la génération de jetons est essentiellement asynchrone . En d’autres termes, au lancement de l’application (quelle que soit la façon dont vous définissez cela), l’arrière-plan qui gère les jetons n’est peut-être pas encore terminé. Il se peut qu’il n’y ait tout simplement pas de jeton disponible lorsque vous le demandez. Et qui sait combien de temps cela prend? Vous feriez mieux d'accepter le jeton lorsque le système vous dit qu'il est prêt au lieu de deviner quand il sera prêt. Suivez le chemin d'implémentation recommandé.

6
Doug Stevenson

Bien que la documentation indique que onNewToken est appelé au premier démarrage de l'application, ce n'est pas le cas. C’est pourquoi j’utilise FirebaseInstanceId respectivement getToken() lorsque j’ai besoin de cet identifiant alors que onNewToken n’a pas encore été appelé alors que l’application est déjà en cours d’exécution. (Nous faisons donc les deux dans notre projet) 

Ce que j’observe, c’est que Firebase appellera onNewToken peu de temps après avoir récupéré le jeton via FirebaseInstanceId. Il semble que le fait de récupérer le jeton de cette manière lance quelque chose dans le service Firebase. 

Cependant, cela fonctionne de cette façon et cela suffit pour notre projet actuel.

Edit: Comme getToken() of FirebaseInstanceId est devenu obsolète récemment, veuillez vous reporter à la réponse d'Arthur Thompson. 

4
Hermann Klecker

Le fait d'appeler FirebaseInstanceId.getInstance().getInstanceId().addOnCompleteListener à chaque lancement d'application est une option (une option inutile). onNewToken permet spécifiquement d'accéder au jeton, le cas échéant.

Notez que l'appel de FirebaseInstanceId.getInstance().getInstanceId().addOnCompleteListener à chaque lancement d'application nécessiterait que vous traitiez le cas où le jeton n'est pas encore disponible. Utiliser onNewToken permet d'éviter cela.

1
Arthur Thompson

La fonction onNewToken() fonctionne comme son prédécesseur, onTokenRefresh().

La mise en œuvre du premier bloc sur vos demandes de publication et attend un jeton. Cela garantit qu'un jeton (ou une exception) sera renvoyé. Cependant, ce jeton n'est pas garanti pour rester le même pour toujours. Semblable à onTokenRefresh(), onNewToken() est déclenché lorsqu'un jeton est généré pour l'instance d'application correspondante, que vous devez utiliser et remplacer par l'ancien.

Mon répondre ici a plus de détails.

0
AL.