web-dev-qa-db-fra.com

Erreur de jeton non enregistré après l'envoi d'une notification

Je suis confronté à ce problème dramatique avec mon application Android lors de l'utilisation de Firebase. 1. Mon application reçoit un jeton lors du premier lancement 2. Je peux envoyer une notification de la console firebase au jeton enregistré 3. Si j'essaie d'envoyer à nouveau une notification avec la console juste après l'étape 2. Elle me montre "jeton non enregistré" après la 2e tentative.

J'ai toute la configuration nécessaire déjà là dans le manifeste et le fichier google service.json est également en place avec la configuration correcte. Je crois que les choses sont correctes, car l'application est capable de recevoir une notification une fois et le problème ne commence que plus tard.

Mise à jour 1: Si je désinstalle l'application et la réinstalle, je ne peux recevoir de notification qu'une seule fois.

Ceux qui veulent regarder le code, voici comment je reçois un jeton:

@Override
public void onTokenRefresh() {

    //Getting registration token
     refreshedToken = FirebaseInstanceId.getInstance().getToken();

    //Displaying token on logcat
    Log.d(TAG, "Refreshed token: " + refreshedToken);
     saveDeviceToken(refreshedToken);
}

Les appels ne sont lancés qu’au premier lancement et après cela, je ne l’ai pas vu se faire appeler (comportement qui, à mon avis, est attendu).

OnMessage reçu est également appelé lors de la première notification, puis il n'est jamais appelé:

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    Log.d("FCM", "From: " + remoteMessage.getFrom());

    if (remoteMessage.getNotification() != null) {
        Log.d("FCM", "Notification Message Body: " + remoteMessage.getNotification().getBody());
        sendNotification(remoteMessage.getNotification().getBody());
    }
}

Mise à jour 2: Tentative de frappe sur l’API HTTP de FCM en utilisant la même clé de serveur et le même jeton et réponse obtenue:

   {
  "multicast_id": 6286279702096230688,
  "success": 0,
  "failure": 1,
  "canonical_ids": 0,
  "results": [
    {
      "error": "NotRegistered"
    }
  ]
}

Juste pour éviter les questions croisées, voici quelques détails supplémentaires:

  • Studio Android: v2.3.1
  • Version du service Google Play: 10.0.1
  • Bibliothèques incluses: noyau, base de données, stockage, messagerie - tout a la même version que google play service 10.0.1

Mise à jour 3: Le crash de Firebase, la base de données et le stockage fonctionnent dans le même projet (ce qui indique que le fichier google service.json est correct).

S'il vous plaît aidez-moi à le faire réparer.

16
Irfan Raza

Voici comment j'ai arrangé.

Comme chacun l’a souligné, le nom du paquet .json pourrait être la raison principale de cet échec, qui s’est également produit ici, mais avec une torsion.

J'avais téléchargé le fichier .json à partir de Firebase et supposais que le fichier .json correct était en cours de téléchargement. Malheureusement, à cause d’un bug lié au téléchargement du fichier dans Firebase, j’avais toujours le fichier .json de certains de mes autres projets (application Firebase) . En investissant le fichier téléchargé, j’ai trouvé le changement et clés manuellement sur le fichier .json.

On m'a suggéré à tout le monde de vérifier le fichier .json inclus avant d'essayer quoi que ce soit d'autre, car c'est la raison principale de ce type de problème.

0
Irfan Raza

Le jeton d'enregistrement peut changer lorsque:

  • L'application supprime l'ID d'instance
  • L'application est restaurée sur un nouvel appareil
  • L'utilisateur désinstalle/réinstalle l'application
  • L'utilisateur efface les données de l'application.

vous pouvez voir la documentation ici

et vous pouvez lire ici aussi à propos des erreurs fcm cela se produit uniquement en mode débogage afin que vous puissiez appeler cette méthode dans votre programme de lancement, cela acceptera le certificat HTTPS du serveur de test/développement, car le certificat HTTPS est invalide/non approuvé. Dans cette version, tout ira bien.

private void RegisterFireBase()
        {

if (BuildConfig.DEBUG) {    
            Task.Run(() =>
            {
                var instanceId = FirebaseInstanceId.Instance;
                instanceId.DeleteInstanceId();
                Android.Util.Log.Debug("TAG", "{0} {1}", instanceId?.Token?.ToString(), instanceId.GetToken(GetString(Resource.String.gcm_defaultSenderId), Firebase.Messaging.FirebaseMessaging.InstanceIdScope));

            });


            ServicePointManager.ServerCertificateValidationCallback += (o, certificate, chain, errors) => true;



        }
1
Digvijay Singh

Je me souviens d'avoir affronté le même problème auparavant. Voici ce que j'ai fait et ça marche bien pour moi. J'espère que cela t'aides,

PreferenceStore est une classe auxiliaire pour enregistrer, modifier et supprimer les préférences partagées.

@Override
public void onTokenRefresh() {
    String token = FirebaseInstanceId.getInstance().getToken();
    Log.i(TAG, "New FCM Token: " + token);

    setup_flag = PreferenceStore.getBoolean(getApplicationContext(), PrefKeys.IS_FIRST_FCM_TOKEN);
    if (!setup_flag) {
        // save token and boolean value in shared preferences for 
        // the first time you run the app after install
        PreferenceStore.saveString(getApplicationContext(), "FCM_TOKEN", token);
        PreferenceStore.saveBoolean(getApplicationContext(), "IS_FIRST_FCM_TOKEN", true);
    } else {
        // other time your app loads, update the token (like call the API endpoint).
    }
}
1
denizen

FCM est l'opposé de GCM.

Lors de l'utilisation de classes GCM, le TokenID est actualisé de temps en temps, c'est pourquoi il est également mis à jour dans la base de données sur le serveur.

Tout en utilisant FCM. L'architecture de base FCM fonctionne sur un unique TokenID, c'est pourquoi onTokenRefresh n'appelle pas plusieurs fois. Il n'invoque qu'une fois.

Ce que vous devez faire est simplement de sauvegarder votre_ INITIALEMENTgénéré/TokenID et l'utiliser en conséquence.

P.S: Le jeton FCM n'est pas actualisé tant que l'application n'est pas réinstallée.  

0
Abdul Ahad