2016-06-08 14 views
16

Sto utilizzando PHP per inviare notifiche su più dispositivi Android alla volta. Tutti gli ID di registrazione sono unici, di seguito è la richiesta CURL che sto inviando.Comunicazioni multiple fornite da GCM

$url='https://android.googleapis.com/gcm/send'; 
$headers = array(
       'Authorization: key=' . ANDROID_KEY, 
       'Content-Type: application/json' 
      ); 
$registration_ids = [];//with multiple registration ids 
$notification = array(
       'registration_ids' => $registration_ids, 
       'data'    => array('notification_id' => $data['notification_id'], 
              'title'   => $data['title'], 
              'message'   => $data['message']) 
      ); 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_FRESH_CONNECT, true); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($notification));   
$res = curl_exec($ch); 

dopo il debug più volte non ho potuto trovare alcun motivo per notifiche multiple (più di 10 volte) sullo stesso dispositivo.

Esiste un modo per controllare il registro delle richieste ricevute da GCM. Qualsiasi vantaggio sarà apprezzato.

+0

Qual è la risposta dopo aver inviato questa richiesta? –

+0

Hai provato il payload della notifica invece del payload dei dati? guarda https://firebase.google.com/docs/cloud-messaging/concept-options –

risposta

0

Puoi provare a eseguire lo script tramite la riga di comando e vedere se invia ancora più notifiche, se non ci deve essere qualche problema nello script in cui questo snippet di codice è implementato.

0

aggiungere alla fine del codice di

echo json_encode($res); 

e vedere il risultato da CGM. Forse puoi vedere il risultato lì, se è ancora un problema, incollalo qui.

0

Provare sotto il codice. L'ho già utilizzato e funziona perfettamente:

$registrationIDs[] = array();//All device tokens 

// Set POST variables 
$url = 'https://android.googleapis.com/gcm/send'; 
$fields = array(
    'registration_ids' => $registrationIDs, 
     'data' => $param, 
); 
$headers = array(
    'Authorization: key=' . $apiKey, // ANDROID PUSH NOTIFICATION API KEY; 
    'Content-Type: application/json' 
); 

// Open connection 
$ch = curl_init(); 
// Set the url, number of POST vars, POST data 
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_POSTFIELDS, json_encode($fields)); 

// Execute post 
$result = curl_exec($ch); 
if ($result === FALSE) { 
    die('Curl failed: ' . curl_error($ch)); 
} else { 
    // "success notification"; 
} 

// Close connection 
curl_close($ch); 

Se si ricevono ancora più notifiche. Devi gestire i token del dispositivo.

Ogni dispositivo può disporre di più token dispositivo. Quindi devi gestirlo con Device Id. Seguire questo passaggio:

  1. Durante la registrazione di un token dispositivo È controlla con Device ID (combinazione di ID dispositivo e dispositivo Token in una tabella). Quindi, prima di salvare, verificare l'ID dispositivo e aggiornare il token di conseguenza in modo che possiamo avere il token dispositivo più recente per quel dispositivo. Ogni dispositivo ha un ID dispositivo univoco.

  2. Mentre l'utente firma nel registro dispositivo token e id dispositivo. Quando un utente si disconnette, basta rendere il token dispositivo vuoto. Per la prossima volta possiamo aggiornare il token del dispositivo in base all'id del dispositivo

0

GCM ha riscontrato alcuni problemi. Ecco perché google ha lanciato Firebase Cloud Messaging (FCM). Controlla la documentazione da here.

Di seguito è riportato un codice di esempio che ho utilizzato nei miei progetti. Provalo con il tuo ID dispositivo Android e la chiave del server FCM.

$data = array(
    'to' => 'XXXXXXXXXXXdevice_idXXXXX', 
    "priority" => "high", 
    'data' => [ 
     'title' => 'Test Title', 
     'body' => 'Test Body', 
    ] 
); 

$headers = array(
    "Content-Type:application/json" 
); 

$headers[] = "Authorization:key=XXXXXXSERVER KEYXXXXXXXXXX"; 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "https://fcm.googleapis.com/fcm/send"); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); 
curl_setopt($ch, CURLOPT_TIMEOUT, 5); 
curl_setopt($ch, CURLOPT_HEADER, false); 
//curl_setopt($ch, CURLOPT_NOBODY, true); 
curl_setopt($ch, CURLOPT_FRESH_CONNECT, true); 
$result = curl_exec($ch); 

curl_close($ch); 

Se si stampa $result variable si otterrà una risposta del genere. Ti dirà se la tua notifica è stata inviata o meno.

{"multicast_id":6375780930000000095,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:139000000000000cd617fcf9fd7ecd"}]}