Как разобрать GCM, чтобы удалить неверный идентификатор регистрации с сервера с помощью php

Я получил вопрос о Google Cloud Messaging …

Я отправляю GCM в Google для трех регистрационных идентификаторов, затем Google отвечает, что 2 регистрационных идентификатора отправлены успешно, а один нет, потому что регистрационный идентификатор был неправильным!

Но он не сообщает мне, какой регистрационный идентификатор не был отправлен …

Теперь вот мой вопрос: как я могу разобрать ответ Google GCM, чтобы получить тот, который регистрационный ID не был отправлен? У Google есть API или что-то такое, что я могу дать ему «multicat_id», и он сообщает мне, какой идентификатор регистрации имел проблему?

Любая помощь будет так высоко оценена, я просто так смущен 🙂

Он основан на заказе:

Предположим, вы пришлите это:

{ "collapse_key": "score_update", "time_to_live": 108, "delay_while_idle": true, "data": { "score": "4x8", "time": "15:16.2342" }, "registration_ids":["4", "8", "15", "16", "23", "42"] } 

И получите ответ от Google:

 { "multicast_id": 216, "success": 3, "failure": 3, "canonical_ids": 1, "results": [ { "message_id": "1:0408" }, { "error": "Unavailable" }, { "error": "InvalidRegistration" }, { "message_id": "1:1516" }, { "message_id": "1:2342", "registration_id": "32" }, { "error": "NotRegistered"} ] } 

Это означает, что 3-й идентификатор регистрации, который вы отправили (15), недействителен, а 6-й (42) не зарегистрирован. Оба должны быть удалены из вашей БД.

Вот как я это сделал:

 $gcm_result = $gcm->send_notification($registration_ids, $message); $jsonArray = json_decode($gcm_result); if(!empty($jsonArray->results)){ $remove_ids = array(); for($i=0; $i<count($jsonArray->results);$i++){ if(isset($jsonArray->results[$i]->error)){ if($jsonArray->results[$i]->error == "NotRegistered"){ $remove_ids[$i] = "'".$registration_ids[$i]."'"; } } } if(!empty($remove_ids)){ $remove_ids_string = implode(', ',$remove_ids); include_once SCRIPTS.'gcm_server_php/db_functions.php'; $dbf = new DB_Functions(); $res = $dbf->deleteUsers($remove_ids_string); echo count($remove_ids)." users have unregistered from notifications since the last one was sent out."; } } 

Основываясь на том, что я читаю здесь:

http://developer.android.com/google/gcm/http.html#error_codes http://developer.android.com/google/gcm/server-ref.html#error-codes

Я разработал следующее (еще не проверено):

 $result = $gcm->send_notification($registration_ids, $message); $jsonArray = json_decode($result); if($jsonArray->canonical_ids != 0 || $jsonArray->failure != 0){ if(!empty($jsonArray->results)) { for($i = 0 ; $i<count($jsonArray->results) ; $i++){ $result = $jsonArray->results[$i]; if(isset($result->message_id) && isset($result->registration_id)) { // You should replace the original ID with the new value (canonical ID) in your server database } else { if(isset($result->error)) { switch ($result->error) { case "NotRegistered": case "InvalidRegistration": // You should remove the registration ID from your server database break; case "Unavailable": case "InternalServerError": // You could retry to send it late in another request. break; case "MissingRegistration": // Check that the request contains a registration ID break; case "InvalidPackageName": // Make sure the message was addressed to a registration ID whose package name matches the value passed in the request. break; case "MismatchSenderId": // Invalid SENDER_ID break; case "MessageTooBig": // Check that the total size of the payload data included in a message does not exceed 4096 bytes break; case "InvalidDataKey": // Check that the payload data does not contain a key that is used internally by GCM. break; case "InvalidTtl": // Check that the value used in time_to_live is an integer representing a duration in seconds between 0 and 2,419,200. break; case "DeviceMessageRateExceed": // Reduce the number of messages sent to this device break; } } } } } }