Android GCM — Как удалить плохие токены устройства из моей (сторонней) базы данных?

В нашей базе данных имеется около 900 токенов устройств Android для push-уведомлений GCM.

Я использую эту функцию PHP для отправки команды push на сервер GCM:

function send_android_push($android_gcm_reg_ids, $title, $message, $activityToLaunch) {

global $ANDROID_GCM_API_KEY, $TESTING, $TEST_ANDROID_DEVICE_REG_ID;

if ($TESTING) {
$android_gcm_reg_ids = [
$TEST_ANDROID_DEVICE_REG_ID
];
}

$url = "https://android.googleapis.com/gcm/send";

$data = array(
"title" => $title,
"message" => $message,
"activityToLaunch" => $activityToLaunch,
);

$post = array(
'registration_ids' => $android_gcm_reg_ids,
'data' => $data
);

$headers = array(
'Authorization: key=' . $ANDROID_GCM_API_KEY,
'Content-Type: application/json'
);

$ch = curl_init();
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($post));
$result = curl_exec($ch);

if (curl_errno($ch)) {
$result .= "<br />GCM error: " . curl_error($ch);
}

curl_close($ch);

return $result;
}

Вот фрагмент содержимого JSON, возвращаемого этой функцией / GCM:

{
"multicast_id":5609284883833846123,
"success":493,
"failure":401,
"canonical_ids":20,
"results":[
{
"registration_id":"BPA91bHP29l2j6NPOldcpAvJCJBGk8oQFErfwuh93cxF8ajJJqBlVGqFcxMDEAc2LL2GKwmP86of49UgBTMycB5IdYergWRBETDNUrnzXX_55FgstCZiauPeD7MokIIPOFoOyW9vCRiBqZhlzLCuSnJ1ENFYtIh_PQ",
"message_id":"0:1462275569015808%814cce86f9fd7ece"},
{
"registration_id":"BPA91bHP29l2j6NPOldcpAvJCJBGk8oQFErfwuh93cxF8ajJJqBlVGqFcxMDEAc2LL2GKwmP86of49UgBTMycB5IdYergWRBETDNUrnzXX_55FgstCZiauPeD7MokIIPOFoOyW9vCRiBqZhlzLCuSnJ1ENFYtIh_PQ",
"message_id":"0:1462275569015815%814cce86f9fd7ece"},
{
"message_id":"0:1462275569014983%814cce86f9fd7ece"},
{
"error":"NotRegistered"},
{
"message_id":"0:1462275569017976%814cce86f9fd7ece"},
etc., etc.

Кажется, в моей базе данных есть токены устройств, которые NotRegistered но, как вы можете видеть, он не сообщает мне, какой токен устройства не зарегистрирован, поэтому мне интересно, как я могу пометить его как устаревший в моей базе данных?

Я подумал, что, возможно, элементы массива JSON, возвращаемые сервером GCM, могут соответствовать $android_gcm_reg_ids массив я передаю в мой send_android_push(...) функция, но это не может быть так, потому что BPA91bHP29l2j6NPOldcpAvJCJBGk8oQFErfwuh93cxF8ajJJqBlVGqFcxMDEAc2LL2GKwmP86of49UgBTMycB5IdYergWRBETDNUrnzXX_55FgstCZiauPeD7MokIIPOFoOyW9vCRiBqZhlzLCuSnJ1ENFYtIh_PQ registration_id появляется множество раз в массиве JSON GCM — несмотря на то, что тот же самый токен только один раз появляется в моей базе данных.

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

И причина, по которой меня это беспокоит, заключается в том, что у меня была ситуация (с iOS), когда отправка плохих токенов устройств (в APNS) приводила к тому, что push-уведомление не отправлялось на допустимые устройства, и я, очевидно, хотел бы сохранить свою базу данных. в любом случае в хорошем состоянии.

Я не могу найти что-то, чтобы помочь в Интернете, поэтому, возможно, я пропускаю или ошибаюсь что-то очевидное?

0

Решение

Чтобы узнать, какой регистрационный токен вызывает это, необходимо сопоставить с тем же индексом в своем registration_ids массив вашего запроса к GCM.

Здесь из документы:

Результаты: массив объектов, представляющих статус обработанных сообщений. Объекты перечислены в том же порядке, что и запрос
(т. е. для каждого регистрационного идентификатора в запросе указывается его результат
в том же индексе в ответе).

2

Другие решения

Других решений пока нет …