web-dev-qa-db-fra.com

Erreur InvalidRegistration dans Firebase Cloud Messaging pour Android

Je développe une application Android utilisant la fonctionnalité de notification push. J'ai besoin de Push du serveur. J'utilise Firebase pour cela. Franchement, c’est la première fois que j’utilise Firebase. Je suis novice à Firebase. Mais quand je pousse du serveur en utilisant PHP et CURL, cela me donne une erreur d'enregistrement invalide.

Je reçois le jeton Firebase dans Android comme ceci

String token = FirebaseInstanceId.getInstance().getToken();

Ensuite, j’enregistre le jeton envoyé au serveur et l’enregistre dans la base de données.

Au serveur, je pousse comme ça

class Pusher extends REST_Controller {

    function __construct()
    {
        parent::__construct();
    }

    public function notification_get()
    {
        $rows = $this->db->get('device_registration')->result();
        $tokens= array();
        if(count($rows)>0)
        {
            foreach($rows as $row)
            {
                $tokens[] = $row->token;
            }
        }
        $message = array("message"=>"FCM Push NOTIFICATION TESTING");
        if(count($tokens)>0)
        {
            $result = $this->send_notification($tokens,$message);
            if(!$result)
            {
                die("Unable to send");
            }
            else{
                $this->response($result, REST_Controller::HTTP_OK);
            }
        }

    }

    function send_notification($tokens,$message)
    {
        $url = 'https://fcm.googleapis.com/fcm/send';
        $fields = array(
                'registration_ids'=>$tokens,
                'data'=>$message
            );

        $headers = array(
                'Authorization:key = AIzaSyApyfgXsNQ3dFTGWR6ns_9pttr694VDe5M',//Server key from firebase
                '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_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
        $result = curl_exec($ch);
        if($result==FALSE)
        {
            return FALSE;
        }
        curl_close($ch);
        return $result;
    }
}

J'utilise le framework CodeIgniter 3 pour la construction d'une API Rest. Lorsque I Push accède à l'URL depuis un navigateur, il renvoie les données JSON avec une erreur comme dans la capture d'écran ci-dessous.

 enter image description here

Comme vous pouvez le constater, l'erreur InvalidRegistration est générée et le message n'est pas transmis aux périphériques. Quel est le problème avec mon code?

Additionnel

Ceci est ma classe FirebaseMessagingService qui affiche une notification dans Android

public class FirebaseMessagingService extends com.google.firebase.messaging.FirebaseMessagingService {

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
        showNotification(remoteMessage.getData().get("message"));
    }

    private void showNotification(String message)
    {
        Intent i = new Intent(this,MainActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

        PendingIntent pendingIntent = PendingIntent.getActivity(this,0,i,PendingIntent.FLAG_UPDATE_CURRENT);

        NotificationCompat.Builder builder = new NotificationCompat.Builder(this).setAutoCancel(true)
                .setContentTitle("FCM Test")
                .setContentText(message)
                .setSmallIcon(R.drawable.info)
                .setContentIntent(pendingIntent);

        NotificationManager manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
        manager.notify(0,builder.build());
    }
}
5
Wai Yan Hein

ID d'enregistrement non valide Vérifiez le formatage de l'ID d'enregistrement que vous transmettez au serveur. Assurez-vous qu'il correspond à l'ID d'enregistrement le téléphone reçoit dans com.google.firebase.INSTANCE_ID_EVENT l'intention et que vous ne le tronquez pas ou que vous n'ajoutez pas plus de personnages. Cela se produit lorsque le code d'erreur est InvalidRegistration.

Veuillez vérifier auprès de l'application et de votre côté que le même identifiant d'enregistrement est stocké sur le serveur dans lequel Application sur mobile le reçoit selon la méthode onTokenRefresh. Vous devriez avoir reçu le même jeton d'enregistrement que le développeur a eu dans FirebaseInstanceId.getInstance().getToken()

Lorsque j'ai reçu votre commentaire et que vous avez mis à jour le code, voici quelques modifications apportées à votre code: elles proviennent de google doc ... 

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {

    // TODO(developer): Handle FCM messages here.
    Log.d(TAG, "From: " + remoteMessage.getFrom());

    // Check if message contains a data payload.
    if (remoteMessage.getData().size() > 0) {
        Log.d(TAG, "Message data payload: " + remoteMessage.getData());
    }

    // Check if message contains a notification payload.
    if (remoteMessage.getNotification() != null) {
        Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
    }

    // Also if you intend on generating your own notifications as a result of a received FCM
    // message, here is where that should be initiated. See sendNotification method below.
}

Firebase a trois types de message:

Messages de notification : Le message de notification fonctionne en arrière-plan ou premier plan. Lorsque l'application est en arrière-plan, les messages de notification sont livré à la barre d'état système. Si l'application est au premier plan, les messages sont gérés par onMessageReceived () ou DidReceiveRemoteNotification des rappels. Ce sont essentiellement ce qui est appelé messages d'affichage.

Messages de données : Sur la plate-forme Android, les messages de données peuvent fonctionner fond et premier plan. Le message de données sera traité par onMessageReceived (). Une note spécifique à la plate-forme serait ici: On Android, la charge de données peut être récupérée dans l’intention utilisée pour lancez votre activité. 

Messages contenant à la fois des données de notification et des données utiles : en mode arrière-plan, les applications reçoivent le contenu de notification dans la notification dans le bac, et ne gérera la charge de données que lorsque l’utilisateur tapera sur le notification. Au premier plan, votre application reçoit un message objet avec les deux charges utiles disponibles. Deuxièmement, le click_action Ce paramètre est souvent utilisé dans les données utiles de notification et non dans les données charge utile. S'il est utilisé dans les données, ce paramètre sera traité en tant que paire clé-valeur personnalisée et par conséquent, vous devez implémenter. logique personnalisée pour que cela fonctionne comme prévu.

2
Arpit Patel

Bien que je n’utilise pas codeigniter et que j’ai rencontré l’erreur InvalidRegistration lors de l’envoi à un périphérique iOS, j’ai pensé partager la façon dont j’ai résolu la situation ici.

Je devais changer registration_ids en en dans PHP lors de l'envoi d'un Notification message à un jeton de périphérique single et m'assurer que la valeur de en était une chaîne et pas un tableau.

Change ça:

'registration_ids'=>$tokens,

Pour ça:

'to'=>$tokens[0],
1
tyler.frankenstein