web-dev-qa-db-fra.com

Jeton FCM Firebase - Quand envoyer au serveur?

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 tokenavant 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!

17
iBobb

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.

10
Chintan Soni

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

14
Arthur Thompson

Nous l'avons traité comme ceci:

  1. Notre serveur crée/met à jour la valeur du jeton par rapport à un ID utilisateur (clé primaire)
  2. Utilisez 2 SharedPreferences
    1. String - token String
    2. Booléen (mis à jour) - si le jeton est mis à jour sur le serveur ou non.

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.

6
Hisham Muneer