web-dev-qa-db-fra.com

L'utilisation de GCM pour envoyer des notifications sur une application renvoie une erreur InvalidRegistration

J'essaie d'envoyer une notification à l'aide de GCM sur mon appareil Android, mais j'obtiens toujours une erreur InvalidRegistration.

Voici le code PHP censé envoyer la notification:

<?php
define('API_ACCESS_KEY', 'API KEY HIDDEN');

$registrationIds = array( $_GET['id']);

// prep the bundle
$msg = array
(
    'message'   => 'TestMessage',
    'title'     => 'TestTitle',
    'subtitle'  => 'TestSubtitle',
    'tickerText'    => 'TestTicker',
    'vibrate'   => 1,
    'sound'     => 1,
    'largeIcon' => 'large_icon',
    'smallIcon' => 'small_icon'
);

$fields = array
(
    'registration_ids'  => $registrationIds,
    'data'          => $msg
);

$headers = array
(
    'Authorization: key=' . API_ACCESS_KEY,
    'Content-Type: application/json'
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://Android.googleapis.com/gcm/send' );
curl_setopt($ch, CURLOPT_POST, true );
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers );
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false );
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode( $fields ) );
$result = curl_exec($ch );
curl_close( $ch );

echo $result;
?>

Voici comment se fait l'enregistrement: 

private void registerInBackground() {
new AsyncTask<Void, Object, String>() {
    @Override
    protected String doInBackground(Void... params) {
        String msg = "";
        try {
            if (gcm == null) {
                gcm = GoogleCloudMessaging.getInstance(context);
            }
            regid = gcm.register(SENDER_ID);
            msg = "Device registered, registration ID=" + regid;

            //Here I save the registration ID, and when I try to use it manually, by running the PHP script above, I get the error.
            sendRegistrationIdToBackend();

            // Persist the registration ID - no need to register again.
            storeRegistrationId(context, regid);
        } catch (IOException ex) {
            msg = "Error :" + ex.getMessage();
        }
        return msg;
    }

    @Override
    protected void onPostExecute(String msg) {
        Toast.makeText(context, msg + "\n", Toast.LENGTH_SHORT).show();
    }

}.execute(null, null, null);

Après avoir exécuté l'application et appelé la méthode qui enregistre l'application, je reçois un ID d'enregistrement. Puis, quand je tape localhost/app/sendNotification.php?id=xxxxxxxxxxxxxx je reçois 

{"multicast_id":8460288429151356251,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"InvalidRegistration"}]}
5
Val

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 Que le téléphone reçoit dans l’intention com.google.Android.c2dm.intent.REGISTRATION Et que vous ne le tronquez pas et n’ajoutez pas Supplémentaire. personnages. Cela se produit lorsque le code d'erreur est InvalidRegistration.

Vous commettez donc une erreur en envoyant au serveur le DeviceID reçu par le téléphone. Assurez-vous que votre code ne modifie en aucun cas le deviceID Vous n'avez pas posté le code pour accepter les identifiants. Il y a une erreur dans cette partie ou dans le stockage des DeviceId. Je ne pense pas qu'il y ait une erreur dans le code que vous avez posté en tant qu'inscription non valide de errorLog show

11
Msk

Si vous récupérez un jeton à partir de la base de données, assurez-vous que le type de données de la colonne est soit du texte, soit un très long varchar comme 200. Le jeton comporte plus de 100 caractères. db

8
Nasz Njoka Sr.

je suis résolu ce problème en envoyant l'identifiant d'enregistrement de périphérique, comme

<?php
require_once('loader.php');

// return json response 
 $json = array();

$registatoin_ids = array("APA91bHhzESU4GQKwS_I-sMMpAPZ44GbC0wvDAO-Dch87_jwJzaB1gK5PPeaGmt6vFZx2Bvd6AC8EkYDl6PurNUDO6zLoxX50q7gLc8GMOLGcwmQgiWwSZS-PPOFn1MpA5hz_TFQ6S-4tstLO");
$message = array("product" => "shirt");

$result = send_Push_notification($registatoin_ids, $message);
echo $result;
?>

dans le fichier register.php. U recevra cet identifiant d’appareil auprès de Google Cloud.

0
Kishor N R