Firebase Messagerie en Nuage de Manutention de déconnexion
Comment gérer la situation, lorsque l'utilisateur se déconnecte de mon application et je ne veux plus de lui pour recevoir des notifications de l'appareil.
J'ai essayé
FirebaseInstanceId.getInstance().deleteToken(FirebaseInstanceId.getInstance().getId(), FirebaseMessaging.INSTANCE_ID_SCOPE)
Mais je continue à recevoir les notifications de mon appareil registration_id
.
J'ai aussi fait en sorte que c'est le signe que je devrais supprimer:
FirebaseInstanceId.getInstance().getToken(FirebaseInstanceId.getInstance().getId(), FirebaseMessaging.INSTANCE_ID_SCOPE)
ou tout simplement FirebaseInstanceId.getInstance().getToken()
).
J'ai aussi essayé FirebaseInstanceId.getInstance().deleteInstanceId()
, mais alors la prochaine fois que j'appelle FirebaseInstanceId.getInstance.getToken
- je recevoir null (il travaille sur le deuxième essai).
Je suppose, d'après deleteInstanceId
je pourrais appeler immédiatement getToken()
de nouveau, mais il ressemble à un hack. Et il y a également cette réponse qui stipule qu'il ne faut pas le faire, mais il propose de supprimer le jeton qui apparemment ne fonctionne pas.
Alors, quelle est la bonne méthode pour gérer cela?
- Assurez-vous de vérifier Dan Alboteanu répondre dans la partie inférieure avant de creuser dans la mise en œuvre de l'une de ces solutions; TL;DR la plupart de ce qui devrait être géré côté serveur, pas côté client.
Vous devez vous connecter pour publier un commentaire.
D'accord. Donc j'ai réussi à faire quelques tests et ont tiré les conclusions suivantes:
deleteToken()
est la contrepartie degetToken(String, String)
, mais pas pourgetToken()
.Il ne fonctionne que si l'ID de l'Expéditeur vous êtes de passage est une autre ID de l'Expéditeur (pas le même ID qui peut être vu dans votre google-services.json). Par exemple, vous voulez permettre à un autre Serveur pour envoyer à votre application, vous appelez
getToken("THEIR_SENDER_ID", "FCM")
de leur donner autorisation à envoyer à votre application. Cette volonté de retourner un autre enregistrement jeton qui correspond seulement à l'expéditeur.Dans l'avenir, si vous avez choisi de retirer leur autorisation à envoyer à votre application, vous devrez alors faire usage de
deleteToken("THEIR_SENDER_ID", "FCM")
. Cela annulerait le jeton correspondant, et lorsque l'Expéditeur tente d'envoyer un message, comme le comportement voulu, ils recevront unNotRegistered
erreur.deleteInstanceId()
.Une mention spéciale cette réponse par @Prince, plus précisément l'exemple de code pour m'aider avec cela.
Comme @MichałK déjà fait dans son poste, après l'appel de la
deleteInstanceId()
,getToken()
doit être appelé pour envoyer une demande pour un nouveau jeton. Cependant, vous n'avez pas à appeler une seconde fois. Tant queonTokenRefresh()
onNewToken()
est mis en œuvre, il doit déclencher automatiquement pour vous offrir le nouveau jeton.Pour faire court,
deleteInstanceId()
>getToken()
> caseonTokenRefresh()
onNewToken()
.Note: Appel
deleteInstanceId()
permettra non seulement de supprimer les de jeton pour votre propre application. Il va supprimer tous les abonnements aux sujets et tous les autres jetons associés à l'instance de l'application.Êtes-vous positif que vous êtes d'appel
deleteToken()
correctement? La valeur pour le public devrait être (aussi vu de ma réponse que vous avez lié) est fixée à l'application du serveur d'ID de l'expéditeur". Vous êtes de passage legetId()
valeur qui n'est pas le même que l'ID de l'Expéditeur (il contient l'instance de l'application valeur de l'id). Aussi, comment êtes-vous d'envoyer le message (Serveur d'Application ou de Notifications de la Console)?getToken()
etgetToken(String, String)
retourne jetons différents. Voir ma réponse ici.C'est probablement parce que la première fois que vous êtes à l'appel de la
getToken()
, c'est encore en cours de génération. C'est juste le comportement voulu.Pas vraiment. C'est la façon dont vous obtiendrez les nouveaux produits (à condition qu'il s'est déjà produit) jeton. Donc, je pense que c'est bien.
catch
.catch
.deleteInstanceId()
). Même si je peux actualiser pour une nouvelle, c'est une bonne option pour moi @ALPROJECT_ID
(celui qui est généré par Google de la Console). --- developers.google.com/instance-id/guides/android-implementationJ'ai fait une brève recherche sur ce qui serait la solution la plus élégante pour reprendre le contrôle total (s'abonner et se désabonner de la FCM) comme avant. Activer et désactiver la FCM après la connexion de l'utilisateur ou à l'extérieur.
L'étape 1. - Empêcher la connexion automatique de l'initialisation
Firebase maintenant la poignée de la
InstanceID
et tout ce qui faut pour générer un enregistrement de jeton. Tout d'abord, vous devez empêcher les auto initialisation. Basé sur le fonctionnaire mis en place la documentation vous devez ajouter ces méta-données valeurs de votreAndroidManifest.xml
:Maintenant vous avez désactivé automatique jeton de processus de demande. Dans le même temps, vous avez une option pour l'activer de nouveau au moment de l'exécution par le code.
L'étape 2. - Mettre en œuvre
enableFCM()
etdisableFCM()
fonctionsSi vous activer la fonction d'initialisation de nouveau alors que vous avez reçu un nouveau jeton immédiatement, c'est donc un moyen idéal pour mettre en œuvre la
enableFCM()
méthode.Tous souscrire à l'information attribués à InstanceID, de sorte que lorsque vous le supprimer puis de lancer pour vous désabonner de tous les sujet. De cette manière vous en mesure de mettre en œuvre
disableFCM()
méthode, il suffit de tourner dos de désactiver l'auto-init avant de le supprimer.L'étape 3. -
FCMService
la mise en œuvre du jeton et le message de réceptionDans la dernière étape, vous avez besoin pour recevoir le nouveau jeton et de les envoyer directement à votre serveur.
D'autres part, vous recevrez un message de données et juste faire ce que vous voulez.
Je pense que cette solution est clair, simple et transparent. Je l'ai testé dans un environnement de production et il fonctionne. J'espère que ça a été utile.
Je travaillais sur le même problème, lorsque j'avais fait mon
logout()
à partir de mon application. Mais le problème était que, après l'enregistrement, j'ai été toujours obtenir les notifications push de Firebase. J'ai essayé de supprimer la Firebase jeton. Mais après la suppression de l'jeton dans monlogout()
méthode, il estnull
quand j'ai une requête pour elle dans monlogin()
méthode. Après avoir travaillé 2 jours, j'ai enfin obtenu une solution.Dans votre
logout()
méthode, supprimer la Firebase jeton dans le fond, car vous ne pouvez pas supprimer Firebase jeton à partir du thread principalDans votre
login()
méthode, de générer les Firebase jeton de nouveau.docs
Je sais je suis en retard pour la fête.
deleteInstanceId()
devrait être appelée à partir de la thread d'arrière-plan, puisque c'est un appel bloquant. Il suffit de cocher la méthodedeleteInstanceId()
dans FirebaseInstanceId() classe.Vous pouvez démarrer une IntentService pour supprimer l'id d'instance et les données qui y sont associées.
Depuis le
getToken()
est obsolète, utilisezgetInstanceId()
de régénérer un nouveau jeton de la place. Il a le même effet.