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 появляется множество раз в массиве GSON JSON - несмотря на то, что тот же самый токен только один раз появляется в моей базе данных.

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

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

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

1 ответ

Решение

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

Вот из документов:

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

Другие вопросы по тегам