it-swarm.com.de

FCM-Push-Benachrichtigungsproblem: - "error": "NotRegistered"

Ich bekomme ein seltsames Problem mit dem Senden von Push-Benachrichtigungen an Android mit FCM. 

Ziel: - Fehler beim Senden der Push-Benachrichtigung

Im Folgenden finden Sie das Szenario, über das ich Push-Benachrichtigungen an Android senden kann 

 public static function SendMultipleNotificationAndroid($groups)
    {
        //your api key SERVER API KEY
        $apiKey = Yii::$app->params['Android_api_key'];
        $url = 'https://fcm.googleapis.com/fcm/send';    
        $headers = array(
            'Authorization:key=' . $apiKey,
            'Content-Type: application/json'
        );

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

        foreach($groups as $resG){
            $users  = $resG['users'];                        
            $msg    =   $resG['message'];
            $type    =   $resG['notification_type'];
            $notification_data    =   $resG['notification_data'];

            $deviceTokens = [];
            foreach($users as $resUser){
                $deviceTokens[] = $resUser['device_token'];
                //Add  Friend badge count +1
                Common::AddRemoveBadgeCount($resUser['user_id']);
            }
            if(!empty($deviceTokens)){
                $fields = array(
                    'registration_ids' => $deviceTokens,
                    'priority'     => 'high', 
                    'collapse_key' => $resG['notification_type'],   
                    'time_to_live' => 2419200,     
                    "click_action" =>"NotificationListingActivity",     
                    'data'         => [                  
                        "title"             => "ProjectName",
                        "body"              => $resG['message'],
                        "action_tag"        => $resG['notification_type'],
                        "message"           => $resG['message'],
                        'notification_type' => $type,
                        'notification_data' => $notification_data,
                        'sound'             => 'default',
                    ]
                );
                //Print result 
                p($ch,0);
                curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
                curl_exec($ch);
            }            
        }
        curl_close($ch);
    }

Das Problem ist also, wenn ich eine einzelne Benachrichtigung sende, funktioniert es gut, aber wenn ich mehrere Benachrichtigungen sende, erhielt ich jedes Mal einen Fehler 

<pre>Resource id #5</pre>{"multicast_id":4818908994630396118,"success":1,"failure":1,"canonical_ids":0,"results":[{"error":"NotRegistered"},{"message_id":"0:1487136045570022%c3bae3c6002e9358"}]}

<pre>Resource id #5</pre>{"multicast_id":5218359780835228544,"success":1,"failure":1,"canonical_ids":0,"results":[{"error":"NotRegistered"},{"message_id":"0:1487136046618669%c3bae3c6002e9358"}]}

Während wir den Code debuggen, befindet sich in unserer Datenbank ein Device-Token, keine Firewall, die das Senden von Push-Benachrichtigungen beendet.

Jedes Mal, wenn ich über der Funktion anrufe, bekam ich 

"Fehler": "NotRegistered"

Jede Hilfe wäre dankbar.

Danke im Voraus. 

8
Shashank Shah

Ich weiß nicht viel über php, aber kürzlich bin ich in einem anderen Projekt mit demselben Problem konfrontiert worden und habe diesen Weg gelöst: 

Stellen Sie dies zuerst fest: Wo finde ich den API-Schlüssel für Firebase Cloud Messaging?

und erhalten Sie einen aktualisierten API-Schlüssel wie unten gezeigt. snapshot  enter image description here

13
Maddy

Laut dem Dokument ist dies darauf zurückzuführen, dass beim Testen mobiler Geräte Ihre App nicht mehr installiert ist

Wenn es nicht registriert ist, sollten Sie die Registrierungs-ID aus .__ entfernen. Ihre Serverdatenbank, da die Anwendung von der .__ deinstalliert wurde. Gerät oder die Client-App ist nicht für den Empfang von Nachrichten konfiguriert.

7
sahan maldeniya

Dies ist ein clientseitiges (Geräte-) Problem, nicht diensteseitig Mehrere Szenarien können folgendes verursachen:

  • Wenn sich die Client-App bei GCM nicht mehr registriert.
  • Wenn die Client-App automatisch nicht mehr registriert wird, kann dies passieren, wenn der Benutzer die Anwendung deinstalliert. Beispielsweise unter iOS, wenn der APNS Feedback Service Das APNS-Token als ungültig gemeldet hat.
  • Wenn das Registrierungstoken abläuft (z. B. kann sich Google dafür entscheiden, Registrierungstoken zu aktualisieren, oder das APNS-Token ist für iOS-Geräte abgelaufen).
  • Wenn die Client-App aktualisiert wird, die neue Version jedoch nicht für den Empfang von Nachrichten konfiguriert ist.

Siehe https://developers.google.com/cloud-messaging/http-server-ref

Beim Start der App überprüfe ich, ob das lokal gespeicherte Token mit dem neuen Token übereinstimmt. Wenn nicht, aktualisiere ich das Token auf meinen Servern. Ich mache das auch in FirebaseInstanceIDService::onTokenRefresh.

1
Dan

Prüfen Sie, ob Sie die App deinstalliert haben und Ihr Gerätetoken geändert wurde. Aktualisieren Sie das Gerätetoken, und Ihr Fehler ist verschwunden 

0
Shivali Kapoor

Bei der Suche nach dem Problem "NotRegistered" haben wir Folgendes gefunden ...

Am Geräteende erfolgte die Generierung des Gerätebenachrichtigungstokens durch folgenden Code einmal, wenn der Benutzer die App zum ersten Mal nach der Installation startet.

RegToken = FirebaseInstanceId.getInstance().getToken(senderId, "FCM");  // Old code

Wir haben andere Klassen verwendet, die von "FirebaseMessagingService" abgeleitet wurden, um Benachrichtigungen zu erstellen/zu erhalten. In dieser Klasse fehlte jedoch die folgende Methode.

// New code
@Override
public void onNewToken(String token) {
    Log.d(TAG, "Refreshed token: " + token);

    // If you want to send messages to this application instance or
    // manage this apps subscriptions on the server side, send the
    // Instance ID token to your app server.
    sendRegistrationToServer(token);
 }

Wir haben festgestellt, dass die obige Methode bei jedem Start der App vom FCM-System im Gerät aufgerufen wurde. (Die App war nicht deinstalliert, dennoch gab die Methode jedes Mal ein anderes Token ab.) Daher haben wir unsere Methode 'sendRegistrationToServer (token);' das Token zusammen mit der 'DeviceId' und anderen Identifikationsdaten an unseren Server zu übermitteln. Als wir über dieses Token eine Benachrichtigung vom PHP-Server gesendet haben, wurde "gesendet" anstelle von "NotRegistered" zurückgegeben.

0
SHS

Ich habe eine 100-prozentige Lösung, mit der ich vor kurzem dieses Problem behoben habe. Dieser Fehler tritt auf, weil Sie diese Benachrichtigung auf einem Gerät senden, das Ihren API-Schlüssel für das Firebase-Setup nicht enthält Ihr Android Token war anders und Ihre Sendeanforderung an ein anderes Firebase-Setup, für das Sie nicht Android Token, für das Sie eine Benachrichtigung (Nachricht) senden möchten) erstellt haben, war anders Müsste sicherstellen, dass Ihr Benutzer Android Token aus demselben Firebase-Projekt generiert, für welches Projekt Sie den Firebase-API-Schlüssel verwenden

0
msk

Die Sache ist, dass firebase eine eindeutige Geräte-ID für Ihr Zielgerät generiert, wenn die App zum ersten Mal ausgeführt wird, und als Identität des Geräts verwendet wird. Wenn der Benutzer die App deinstalliert oder die Daten der App löscht, dann In that case Beim erneuten Installieren oder Öffnen der App unterscheidet sich die Geräte-ID, die von der Firebase nicht identifiziert wird, um die Benachrichtigung zu senden. Dies führt zu dem Fehler Nicht registriert

0
maheshmnj