Intereting Posts
Android: Сброс позиции анимации после завершения Возможно ли настроить проект Android IntelliJ для работы с maven? Android: LocationManager динамически регулирует пороговые значения minTime / minDistance Как хранить и извлекать изображения в базе данных Androidite SQL и отображать их на gridview Android запускает приложение с QR-кода с параметрами Android Install apk с использованием командной строки busybox Почему во время запуска приложения всегда отображается GC_CONCURRENT FREED и GC_CONCURRENT ALLOCATE в Android Logcat? Что позволяет Android Eclipse LogCat? Есть ли способ игнорировать INSTALL_FAILED_VERSION_DOWNGRADE при установке приложения с Android Debug Bridge? Приложение скомпилируется каждый раз, когда Gradle запускается, принимая значительное время Android Yelp, как панель поиска в ActionBar Значок панели действий, скрытый после того, как SearchView расширяется Пользовательский информационный оконный адаптер с пользовательскими данными на карте v2 Android Wi-Fi Scan: фильтровать принтеры из ScanResult Метод retrieveRequestToken повышает «Не удалось связаться с поставщиком услуг: null»

GCON канонический идентификатор

При наличии нескольких регидов для 1 устройства GCM возвращает каноническую ошибку id:

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

Таким образом, он показывает новейший regid, который должен использоваться GCM, но почему он не показывает регистр, который вы должны удалить (старый)? Как узнать, что такое старый регистр и какой из них я должен удалить из своей базы данных?

Solutions Collecting From Web of "GCON канонический идентификатор"

Ответ Эрана верный, хотя я нашел его немного туманным для меня. Однако, благодаря ему, я нашел решение.

Скажите, что это ваш ответ:

 { "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" } ] } 

Как вы можете видеть, 2 из 7 сообщений являются дубликатами.

Так я отправляю сообщения на сервер:

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

Из ответа Эрана:

Поскольку вы получаете ответ от Google за каждый отправленный вами запрос, вы должны знать, какие идентификаторы регистрации были отправлены в Google в запросе, вызвавшем этот ответ. Старый идентификатор регистрации, который вы должны удалить, – это второй идентификатор регистрации в этом запросе.

Это означает, что индексы 2 и 5 регистра $ id регистра [] должны быть заменены на MY_REG_ID_1 и MY_REG_ID_2 .

Наконец, проверьте двойные значения и удалите точные дубликаты. Результатом должен быть массив с 5 регидами (или напрямую удалить этот индекс из вашего массива вместо замены с помощью MY_REG_ID_ #).

Включенный вами ответ GCM указывает, что вы отправили сообщение на два регистрационных идентификатора. Оба сообщения были успешно получены в службе GCM. Только для второго сообщения вы получили канонический регистрационный идентификатор.

Поскольку вы получаете ответ от Google за каждый отправленный вами запрос, вы должны знать, какие идентификаторы регистрации были отправлены в Google в запросе, вызвавшем этот ответ. Старый идентификатор регистрации, который вы должны удалить, – это второй идентификатор регистрации в этом запросе.

 <?php //ASSUME gcm_registration_table field // id || registration_id || user_id || created_at || updated_at // FIND CANONICAL IDS POSITION function CanonicalIdPosition($gcm_response) { $c_ids = array(); foreach ($gcm_response['results'] as $k => $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); 
 <?php // API access key from Google API's Console define( 'API_ACCESS_KEY', 'AIzaSyCa1vcyOF6UhM6cgvnwARBafmdl8haQo1Y' ); $con=mysqli_connect("localhost","root","","bloodbank_master"); $response = array(); $q="SELECT `regester_id` FROM `gcm`"; $result1 = $con->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"; } ?>