web-dev-qa-db-fra.com

Problème de notification FCM: - "error": "NotRegistered"

Je reçois un problème étrange concernant l'envoi de notifications Push à Android via FCM. 

Objectif: - Avoir une erreur lors de l'envoi de la notification push

Vous trouverez ci-dessous un scénario permettant d'envoyer des notifications push à Android. 

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

Donc, le problème, c’est que lorsque j’envoie une notification unique, cela fonctionne bien, mais lorsque j’envoie plusieurs notifications, j’ai toujours une erreur. 

<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"}]}

Au moment de déboguer le code, nous avons un jeton de périphérique dans notre base de données, pas de pare-feu qui cesse d’envoyer des notifications Push.

Chaque fois que j'appelle la fonction ci-dessus je me suis 

"erreur": "NotRegistered"

Toute aide serait appréciée.

Merci d'avance. 

8
Shashank Shah

Je ne connais pas grand chose à propos de php, mais récemment, j'ai rencontré le même problème dans un autre projet et j'ai résolu ce problème: 

Référez-vous d'abord à ceci: Où puis-je trouver la clé API pour la messagerie Cloud Firebase?

et obtenez la clé API mise à jour comme indiqué ci-dessous snapshot  enter image description here

13
Maddy

Selon la documentation, c’est parce que votre application n’a plus installé votre application pour le test des appareils mobiles.

S'il s'agit de NotRegistered, vous devez supprimer l'ID d'enregistrement de la base de données de votre serveur car l’application a été désinstallée du appareil ou l'application cliente n'est pas configurée pour recevoir des messages.

7
sahan maldeniya

Il s'agit d'un problème (périphérique) côté client, et non pas côté service . Plusieurs scénarios peuvent entraîner les conséquences suivantes:

  • Si l'application cliente se désenregistre avec GCM.
  • Si l'application cliente est automatiquement désinscrite, cela peut se produire si l'utilisateur désinstalle l'application. Par exemple, sur iOS, si le service de retour d'informations APNS A signalé le jeton APNS comme non valide.
  • Si le jeton d'enregistrement expire (par exemple, Google peut décider d'actualiser les jetons d'enregistrement ou le jeton APNS a expiré pour les appareils iOS).
  • Si l'application client est mise à jour mais que la nouvelle version n'est pas configurée pour recevoir des messages.

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

Au démarrage de l'application, je vérifie si le jeton que j'ai stocké localement correspond au nouveau jeton. Sinon, j'actualise le jeton sur mes serveurs. Je le fais aussi dans FirebaseInstanceIDService::onTokenRefresh.

1
Dan

Voyez si vous avez désinstallé l'application et votre jeton de périphérique est modifié. Mettez à jour le jeton de périphérique et votre erreur disparaîtra. 

0
Shivali Kapoor

En cherchant le problème "NotRegistered", nous avons trouvé ce qui suit ...

À la fin du périphérique, la génération du jeton de notification de périphérique a été effectuée en suivant le code une fois, lorsque l'utilisateur lance pour la première fois l'application après l'installation.

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

Nous utilisions une autre classe dérivée de "FirebaseMessagingService" pour créer/recevoir des notifications. Mais la méthode suivante manquait dans cette classe.

// 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);
 }

Nous avons constaté que la méthode ci-dessus était appelée par le système FCM dans l'appareil à chaque démarrage de l'application. (L'application n'était pas désinstallée, la méthode donnait toujours un jeton différent à chaque fois.) Nous avons donc appelé notre méthode 'sendRegistrationToServer (token);' soumettre le jeton à notre serveur avec le 'DeviceId' et d'autres données d'identification. Lorsque nous avons envoyé une notification du serveur php sur ce jeton, il a renvoyé "envoyé" au lieu de "NotRegistered".

0
SHS