15

Ich stehe vor diesem dramatischen Problem mit meiner Android-App während der Verwendung von Firebase. 1. Meine App erhält Token beim ersten Start 2. Ich kann Benachrichtigungen von Firebase-Konsole an das registrierte Token senden 3. Wenn ich versuche, eine Benachrichtigung erneut mit der Konsole direkt nach Schritt 2 zu senden. Es zeigt mir " unregistrierter Token "ab dem 2. Versuch.Nicht registrierte Token-Fehler nach dem Senden einer Benachrichtigung

Ich habe alle notwendigen Konfiguration bereits dort in der Manifest-und Google-Dienst.json-Datei ist auch vorhanden mit der richtigen Konfiguration. Ich glaube, die Dinge sind korrekt, weil die App eine Benachrichtigung erhalten kann und das Problem erst danach kommt.

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

Diejenigen, die auf den Code sehen will, ist dies, wie ich bin immer Token:

@Override 
public void onTokenRefresh() { 

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

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

Diese bekommt Anrufe nur zum ersten Mal starten und danach habe ich es nicht gesehen immer genannt (was ich denke, ist das erwartete Verhalten).

OnMessage erhielt auch bei der ersten Meldung aufgerufen wird und dann wird nie abgeblasen:

@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: Versucht das HTTP api von FCM mit dem gleichen Server-Schlüssel und Token und bekam folgende Antwort zu treffen :

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

Gerade Quer Fragen zu vermeiden, hier sind einige weitere Details:

  • Android Studio: v2.3.1
  • Google Play-Service-Version: 10.0.1
  • Bibliotheken enthalten: Kern, Datenbank, Speicher, Messaging - alle die gleiche Version wie Google ist mit spielen Service 10.0.1

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

Bitte helfen Sie mir, es zu beheben.

+0

Haben Sie beim Testen zunächst versucht, die App zu deinstallieren und neu zu installieren? –

+1

Ja! Ich habe es versucht. Ich habe auch versucht, Caches neu zu erstellen, komplette Änderung von Paketen und JSON-Datei auch. –

+0

Ich empfehle Ihnen, ** Google Play Services & Firebase auf die neuesten 10.2.4 ** zu aktualisieren. Firebase befindet sich immer noch in der späten Betaphase und viele seiner Funktionen werden in Updates behoben, z. B. von Firebase 10.0.x bis 10.2.x war die Änderung des Benutzernamens/Fotos fehlerhaft und erschien nicht in Echtzeit ohne eine erneute Überprüfung -Anmeldung. Es wurde behoben, nachdem Firebase viele Male kontaktiert wurde. Außerdem wird ** onMessageReceived() ** aufgerufen, wenn Ihre App im Hintergrund ausgeführt wird. Wenn Ihre App gestoppt wird, wird die Benachrichtigung standardmäßig über die Systembenachrichtigung verarbeitet. – Nihal

Antwort

0

Hier wie ich behoben.

Wie von allen darauf hingewiesen, dass Paketname der .json-Datei der Hauptgrund für diesen Fehler sein könnte, der hier auch wahr, aber mit einer Wendung.

Ich hatte die .json-Datei von Firebase heruntergeladen und ging davon aus, dass die richtige .json-Datei heruntergeladen wurde. Leider habe ich aufgrund eines Fehlers in Firebase beim Herunterladen der Datei immer die .json-Datei meines anderen Projekts (Firebase-App) bekommen. Beim Investieren der heruntergeladenen Datei habe ich es herausgefunden und den Paketnamen und die Schlüssel manuell in der .json Datei geändert.

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

1

Die Registrierungstoken kann sich ändern, wenn:

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

Sie die Dokumentation sehen here

und Sie here auch über fcm Fehler lesen kann dies geschieht für den Debug-Modus nur so Sie diese Methode in Launchers Aktivität aufrufen kann dies über das HTTPS-Zertifikat-Test akzeptiert/Entwicklungsserver, da das HTTPS-Zertifikat ungültig/nicht vertrauenswürdig ist In der Veröffentlichung wird es in Ordnung 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; 



     } 
0

FCM ist das Gegenteil von GCM.

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

Während der Verwendung von FCM. Die FCM-Basisarchitektur arbeitet mit einer eindeutigen TokenID. Dies ist der Grund dafür, dass onTokenRefresh nicht mehrmals aufgerufen wird. Es wird nur einmal aufgerufen.

Was Sie tun müssen, ist nur speichern Sie Ihre INITIALLY generiert TokenID und nutzen Sie es entsprechend.

S.: Im FCM-Token wird erst aktualisiert, wenn die App neu installiert wird.

+0

Nur um Sie zu informieren, dass ich Token-ID in meiner Datenbank speichern und wenn ich eine Benachrichtigung auf demselben sende es funktioniert für die erste Benachrichtigung und dann nach allen nachfolgenden Benachrichtigung zeigt es mir oben genannten Fehler. –

1

Ich erinnere mich an das ähnliche Problem vor. 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 von gemeinsamen Einstellungen.

@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). 
    } 
} 
Verwandte Themen