2015-04-17 14 views
5

Sto tentando di inviare una notifica utilizzando GCM sul mio dispositivo Android, ma ottengo sempre l'errore InvalidRegistration.Utilizzo di GCM per inviare notifiche sull'app, restituisce InvalidRegistration error

Ecco il codice PHP che dovrebbe inviare la notifica:

<?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; 
?> 

Questo è come la registrazione viene effettuata:

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

Dopo aver eseguito l'applicazione, e chiamando il metodo che registra l'app, ottengo un ID di registrazione. Poi, quando si digita localhost/app/sendNotification.php?id=xxxxxxxxxxxxxx ricevo

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

risposta

11

ID di registrazione non valido Controllare la formattazione del ID di registrazione che si passa al server. Assicurati che corrisponda all'ID di registrazione il telefono riceve nell'intento com.google.android.c2dm.intent.REGISTRATION e che non lo stai troncando o aggiungendo altri caratteri. Accade quando il codice di errore è InvalidRegistration.

Quindi in pratica si sta commettendo un errore nell'invio del DeviceID ricevuto dal telefono al server. Assicurati che il tuo codice non modifichi il DeviceId in alcun modo. Non hai pubblicato il codice per accettare gli Id. C'è un errore in quella parte o nella memorizzazione dei DeviceId. Non credo ci sia alcun errore nel codice che hai postato come registro errato dello show error

+0

Ecco, ho avuto un piccolo problema, ora l'ho risolto. Ricevo 'successo: 1' ora, ho un'altra domanda, come posso iniziare a ricevere messaggi nell'app adesso? Non stanno arrivando – Val

+0

https://developer.android.com/google/gcm/client.html controlla la parte per Ricevere un messaggio a valle – Msk

+0

Ricevo anche un problema smilar come l'hai risolto @Val –

6

Qualsiasi altro se stai recuperando token da db assicurati che il tipo di dati per la colonna sia di testo o un varchar molto lungo come 200 . il token è lunga più di 100 caratteri in modo che possa essere sempre tagliato a metà per essere memorizzati nel db

+0

Grazie! Pensavo che una colonna di 128 caratteri sarebbe stata sufficiente, ma non lo era. L'espansione aveva risolto il mio problema – Yerke

0

sto risolto questo problema con l'invio di dispositivo di registrazione id, come

<?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; 
?> 

nel registro. file php. U riceverà l'ID di registrazione del dispositivo da google cloud.

Problemi correlati