wake-up-neo.com

Nicht registrierter Tokenfehler nach dem Senden einer Benachrichtigung

Ich stehe vor diesem dramatischen Problem mit meiner Android-App während der Verwendung von Firebase. 1. Meine App erhält beim ersten Start ein Token 2. Ich kann eine Benachrichtigung von der Firebase-Konsole an das registrierte Token .__ senden. 3. Wenn ich versuche, kurz nach Schritt 2 erneut eine Benachrichtigung mit der Konsole zu senden, wird nach dem 2. Versuch "unregistriertes Token" angezeigt.

Ich habe alle notwendigen Einstellungen bereits in der Manifest-Datei und google service.json ist auch mit der richtigen Konfiguration vorhanden. Ich glaube, dass die Dinge korrekt sind, weil die App einmalig eine Benachrichtigung erhalten kann und das Problem erst danach auftritt.

Update 1: Wenn ich die App deinstalliere und neu installiere, kann ich auch nur einmal eine Benachrichtigung erhalten.

Diejenigen, die sich den Code anschauen wollen, bekomme ich hier:

@Override
public void onTokenRefresh() {

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

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

Dies bekommt Aufrufe nur beim ersten Start und danach habe ich nicht gesehen, dass es aufgerufen wurde (was ich als Verhalten erwartet habe).

Erhaltene OnMessage-Nachrichten werden auch bei der ersten Benachrichtigung abgerufen und dann nie abgerufen:

@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());
    }
}

Update 2: Es wurde versucht, die HTTP-API von FCM unter Verwendung desselben Serverschlüssels und -tokens zu schlagen, und erhielt folgende Antwort:

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

Um Kreuzfragen zu vermeiden, folgen hier einige Details:

  • Android Studio: v2.3.1
  • Version des Google Play-Dienstes: 10.0.1
  • Mitgelieferte Bibliotheken: Core, Datenbank, Speicher, Messaging - Alle haben dieselbe Version wie Google Play Service 10.0.1

Update 3: Firebase-Absturz, Datenbank und Speicher funktionieren im selben Projekt (was zeigt, dass die Datei google service.json korrekt ist).

Bitte helfen Sie mir, das Problem zu beheben.

16
Irfan Raza

Hier wie ich es herausgefunden habe.

Wie jeder darauf hinweist, könnte der Paketname der .json-Datei der Hauptgrund für diesen Fehler sein, der auch hier wahr wurde, jedoch mit einem gewissen Unterschied.

Ich hatte die .json-Datei von Firebase heruntergeladen und ging davon aus, dass die korrekte .json-Datei heruntergeladen wurde. Aufgrund eines Fehlers in Firebase beim Herunterladen der Datei erhielt ich leider immer die .json-Datei eines anderen Projekts (Firebase-App). Wenn ich die heruntergeladene Datei investierte, fand ich sie heraus und änderte den Paketnamen und Tasten manuell für die .json-Datei.

Ich empfahl jedem, die enthaltene .json-Datei zu überprüfen, bevor Sie etwas anderes versuchen, da dies der Hauptgrund für diese Art von Problem ist.

0
Irfan Raza

Das Registrierungstoken kann sich ändern, wenn:

  • Die App löscht die Instanz-ID
  • Die App wird auf einem neuen Gerät wiederhergestellt
  • Der Benutzer deinstalliert/installiert die App neu
  • Der Benutzer löscht die App-Daten.

sie können die Dokumentation hier sehen

sie können here auch über fcm-Fehler lesen. __ Dies geschieht nur für den Debug-Modus, sodass Sie diese Methode in Ihrer Launcher-Aktivität aufrufen können. Dies akzeptiert das HTTPS-Zertifikat des Test/Development-Servers, da das HTTPS-Zertifikat ungültig ist/nicht vertrauenswürdig.__Im Release wird es okay sein.

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

Ich erinnere mich, dass ich vor ähnlichen Problemen stand. Hier ist was ich getan habe und es funktioniert reibungslos für mich. Hoffe das hilft,

PreferenceStore ist eine Hilfsklasse zum Speichern, Bearbeiten und Löschen gemeinsam genutzter Voreinstellungen.

@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 ist das Gegenteil von GCM.

Bei der Verwendung von GCM-Klassen wird die TokenID gelegentlich aktualisiert, weshalb sie auch in der Datenbank auf dem Server aktualisiert wird.

Während der Verwendung von FCM. Die FCM-Basisarchitektur funktioniert mit einer eindeutigen TokenID. Dies ist der Grund, warum onTokenRefresh nicht mehrmals aufgerufen wird. Es ruft nur einmal auf.

Sie müssen lediglich IhreZUNÄCHSTgenerierte TokenID speichern und entsprechend verwenden.

P.S: In FCM wird das Token erst dann aktualisiert, wenn die App erneut installiert wird.  

0
Abdul Ahad