ID canónico de GCM

Al tener varios regids para 1 dispositivo, GCM devuelve el error de identificación canónica:

{"multicast_id":xxxx,"success":2,"failure":0,"canonical_ids":1,"results":[{"message_id":"xxxxx"},{"registration_id":"newest reg ID here","message_id":"xxxxxx"}]} 

Entonces, muestra el regid más nuevo que debe usar GCM, pero ¿por qué no muestra el regid que debería eliminar (el anterior)? ¿Cómo sé cuál es el regid anterior y cuál debería eliminar de mi base de datos?

La respuesta de Eran es correcta, aunque me pareció un poco neblinosa. Sin embargo, gracias a él encontré una solución.

Diga que esta es su respuesta:

 { "multicast_id":xxxxx, "success":7, "failure":0, "canonical_ids":2, "results":[ { "message_id":"0:xxx%xxxxx" }, { "message_id":"0:xxx%xxxxx" }, { "registration_id":"MY_REG_ID_1", "message_id":"0:xxx%xxxxx" }, { "message_id":"0:xxx%xxxxx" }, { "message_id":"0:xxx%xxxxx" }, { "registration_id":"MY_REG_ID_2", "message_id":"0:xxx%xxxxx" }, { "message_id":"0:xxx%xxxxx" } ] } 

Como puede ver, 2 de los 7 mensajes son un duplicado.

Esta es la forma en que envío mensajes al servidor:

 $tokenResult = mysql_query("SELECT reg_ids FROM table_with_regids"); // $i = 0; while($row = mysql_fetch_array($tokenResult)) { $registrationIDs[$i] = $row['reg_ids']; $i++; } 

de la respuesta de Eran:

Como recibe una respuesta de Google para cada solicitud que envía, debe saber qué ID de registro se enviaron a Google en la solicitud que activó esta respuesta. El ID de registro anterior que debe eliminar es el segundo ID de registro en esa solicitud.

Esto significa que los índices 2 y 5 de la matriz $ registrationIDs [] deben reemplazarse con MY_REG_ID_1 y MY_REG_ID_2 .

Finalmente, compruebe los valores dobles y elimine los duplicados exactos. El resultado debería ser una matriz con 5 regids (o eliminar directamente ese índice de su matriz en lugar de reemplazarlo con MY_REG_ID_ #).

La respuesta de GCM que incluyó indica que envió un mensaje a dos ID de registro. Ambos mensajes se recibieron en el servicio de GCM con éxito. Solo para el segundo mensaje tienes una ID de registro canónica.

Como recibe una respuesta de Google para cada solicitud que envía, debe saber qué ID de registro se enviaron a Google en la solicitud que activó esta respuesta. El ID de registro anterior que debe eliminar es el segundo ID de registro en esa solicitud.

  $val) { if (isset($val['registration_id'])) { $c_ids[] = $k; } } if ($c_ids) { return $c_ids; } else { return false; } } // Find Duplicate registration Ids from Server Matchind to index position function DuplicateRegIdFromRegistrationTable($canonical_ids) { DB::query("SELECT registration_id FROM gcm_registration_table"); $results = DB::fetch_assoc_all(); $duplicate_reg_val = array(); // Match Position and Find Value foreach ($results as $key => $val) { if (in_array($key, $canonical_ids)) { $duplicate_reg_val[] = $val['registration_id']; } } return $duplicate_reg_val; } // update existing Duplicate registration id with New Canonical registration ids function UpdateDuplicateRegIds($duplicateVal) { foreach ($duplicateVal as $val) { $sql = "UPDATE gcm_registration_table SET registration_id = {$val} WHERE registration_id ={$val}"; // Some Yours Code... } } // Method to send Notification to GCM Server function SendGcmNotification($registatoin_ids_from_table, $message, $gcm_api_key, $dry_run = false) { // Set POST variables $url = 'https://android.googleapis.com/gcm/send'; $fields = array( 'registration_ids' => $registatoin_ids, 'data' => $message, 'dry_run' => $dry_run ); $headers = array( 'Authorization: key=' . $gcm_api_key, 'Content-Type: application/json' ); //print_r($headers); // Open connection if (!class_exists('curl_init')) { $ch = curl_init(); } else { echo "Class Doesnot Exist"; exit(); } // 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); // Disabling SSL Certificate support temporarly curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields)); // Execute post $result = curl_exec($ch); if ($result === FALSE) { die('Curl failed: ' . curl_error($ch)); return false; } else { return json_decode($result, true); } // Close connection curl_close($ch); } //This Wont Send Notification to Device but gives you response to remove canonical ids $gcm_response = SendGcmNotification($registatoin_ids_from_table, $message, $gcm_api_key, $dry_run = true); $canonical_ids = CanonicalIdPosition($gcm_response); if ($canonical_ids) { $duplicate_ids = DuplicateRegIdFromRegistrationTable($canonical_ids); UpdateDuplicateRegIds($duplicate_ids); } // Finally Get updated Registration Ids from table and send to GCM Server with $gcm_response = SendGcmNotification($registatoin_ids_from_table, $message, $gcm_api_key, $dry_run = false); 
 query($q) ; if ($result1->num_rows > 0) { $response["users"] = array(); while ($row = $result1->fetch_array(MYSQLI_BOTH)) { $user = array(); $registrationIds = array($row[0]); $msg = array ( 'message' => 'hieee', 'title' => 'Blood Bank', 'subtitle' => 'This is a subtitle. subtitle', 'tickerText' => 'Ticker text here...Ticker text here...Ticker text here', '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; } } else { $response["success"] = 0; $response["message"] = "No users found"; } ?>