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.
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é.
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.
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.
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.