D'accord, j'ai une application qui, au premier démarrage, vous fait parcourir quelques diapositives de bienvenue, puis vous amène à une page de connexion/enregistrement, puis à MainActivity
.
Je viens d'implémenter FCM
et les services génèrent un token
avant aucune de ces pages n'a été vue par l'utilisateur. Comment pourrais-je faire en sorte que le service fonctionne après j'arrive à MainActivity
?
Le problème est que j'essaie d'envoyer le jeton dès qu'il est actualisé dans le MySQL DB
au compte d'utilisateur approprié, mais comme l'utilisateur n'est pas encore connecté, c'est null
et mon message au serveur échoue. Quelle est la bonne façon de concevoir cela? J'ai pensé à enregistrer le jeton dans SharedPreferences
et à l'envoyer au serveur après que l'utilisateur s'est connecté, mais cela crée beaucoup de complications lorsque le jeton est actualisé à un moment ultérieur?!
Solution possible:
Je ne suis pas sûr de bien comprendre comment fonctionnent les 2 services, mais disons dans onTokenRefresh
Je viens d'enregistrer le jeton dans SharedPreferences
et dans MainActivity j'obtiens la valeur de SP
puis Je l'envoie au serveur. Dans ce cas, lorsque le jeton est actualisé, la nouvelle valeur est immédiatement renvoyée dans SharedPreferences
. Mais j'aurais quand même besoin de vérifier s'il s'agit d'une nouvelle valeur dans SP puis de la télécharger à nouveau sur le serveur. C'est déroutant!
Oui, le jeton FCM est généré automatiquement. Mais essayez de voir cela sous un angle différent.
C'est ainsi que je l'ai géré.
Laissez FCM générer un jeton dès que votre application démarre. OnTokenRefresh sera appelé et il vous suffit de l'enregistrer dans vos préférences en tant que:
@Override
public void onTokenRefresh() {
// Get updated InstanceID token.
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d(TAG, "Refreshed token: " + refreshedToken);
sendRegistrationToServer(refreshedToken);
}
private void sendRegistrationToServer(String token) {
// Add custom implementation, as needed.
SharedPreferenceUtils.getInstance(this).setValue(getString(R.string.firebase_cloud_messaging_token), token);
// To implement: Only if user is registered, i.e. UserId is available in preference, update token on server.
int userId = SharedPreferenceUtils.getInstance(this).getIntValue(getString(R.string.user_id), 0);
if(userId != 0){
// Implement code to update registration token to server
}
}
J'espère que vous êtes clair avec le chemin. Demandez si vous avez besoin de plus de dégagement.
Notez que vous pouvez toujours récupérer le jeton avec:
FirebaseInstanceID.getInstance().getToken();
Cela renverra null
si le jeton n'a pas encore été généré ou le jeton s'il a été généré. Dans votre cas, il est très probable que le jeton soit généré au moment de la connexion de l'utilisateur. Vous devriez donc pouvoir l'envoyer à votre serveur d'applications dès que l'utilisateur s'est connecté. S'il n'est pas disponible, vous devez l'enverrait dans le rappel onTokenRefresh comme Chintan Soni l'a mentionné.
Nous l'avons traité comme ceci:
En cas d'actualisation du jeton, nous mettons à jour la chaîne de jeton et définissons le booléen sur false. Plus tard, chaque fois que l'utilisateur se connecte à chaque fois que nous recherchons un booléen (mis à jour), si c'est faux - nous attachons le jeton actuel à son identifiant et l'envoyons au serveur et définissons mis à jour sur true.