Подтвердить что ты не робот

GCM 3.0 Требуется обновить токен регистрации?

С последним обновлением GCM (3.0) все еще необходимо обработать обновление токена регистрации во время таких ситуаций, как перезагрузка? В этой статье обсуждается вопрос о том, как сделать GCM надежным и охватывает несколько условий, в которых токен регистрации может измениться. Необходимы ли эти шаги в последней версии? Во время беседы IO 2015 они говорили так, как будто токен регистрации был хорош, пока приложение не было удалено с устройства.

InstanceID instanceID = InstanceID.getInstance(this);
String token = instanceID.getToken(getString(R.string.gcm_defaultSenderId),
    GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
4b9b3361

Ответ 1

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

С обновленным API вам необходимо реализовать InstanceIDListenerService, чтобы обрабатывать обновления токенов, как показано в google-services # android # gcm Пример приложения

    /**
     * Called if InstanceID token is updated. This may occur if the security of
     * the previous token had been compromised. This call is initiated by the
     * InstanceID provider.
     */
    // [START refresh_token]
    @Override
    public void onTokenRefresh() {
        // Fetch updated Instance ID token and notify our app server of any changes (if applicable).
        Intent intent = new Intent(this, RegistrationIntentService.class);
        startService(intent);
    }

Относительно других ситуаций, когда может произойти обновление токена.

Существующий регистрационный токен может перестать быть действительным в ряде сценариев, в том числе:
- Если клиентское приложение отменяет регистрацию с помощью GCM.
- Если клиентское приложение автоматически не зарегистрировано, это может произойти, если пользователь удалит приложение. Например, на iOS, если APNS Служба отзывов сообщила, что токен APNS недействителен.
- Если токен регистрации истекает (например, Google может решить обновить токены регистрации, или токен APNS истек для iOS устройства).
- Если клиентское приложение обновлено, но новая версия не настроена для приема сообщений.

Для всех этих случаев удалите этот регистрационный токен из приложения сервера и прекратить использовать его для отправки сообщений.

Чтобы защитить клиентское приложение и сервер приложений от потенциальных вредоносных повторное использование регистрационных токенов, вы должны периодически инициировать токен обновить с сервера. Когда обновление токена регистрации GCM инициированное с сервера, клиентское приложение должно обрабатывать tokenRefreshed сообщение с клиентом/сервером регистрации GCM рукопожатие
См. Ссылку API для получения дополнительной информации о процедуре обновления идентичности и токена.

Ответ 2

EDIT: ознакомьтесь с документами InstanceID, так как это показывает, как обрабатывать токены. https://developers.google.com/instance-id/ и https://developers.google.com/instance-id/guides/android-implementation

Не очень понятно с сервера PoV imho.

Из https://developers.google.com/cloud-messaging/registration#keeping-the-registration-state-in-sync у нас есть

Чтобы защитить клиентское приложение и сервер приложений от возможного вредоносного повторного использования токенов регистрации, вы должны периодически инициировать обновление токена с сервера. Когда обновление маркера регистрации GCM инициируется со стороны сервера, клиентское приложение должно обрабатывать сообщение tokenRefreshed с подтверждением квитанции клиента/сервера GCM. См. Ссылку API для получения дополнительной информации о процедуре обновления идентичности и токена.

Hmm, нет ссылки на ссылку API - так что смотрите на сервер api здесь https://developers.google.com/cloud-messaging/server-ref#interpret-downstream у нас есть поле canonical_ids, которое

Число результатов, содержащих токен регистрации. См. Обзор регистрации для более подробного обсуждения этой темы.

и a results, которое имеет

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

Для клиентской стороны у нас есть новый https://developers.google.com/android/reference/com/google/android/gms/iid/InstanceIDListenerService.html#onTokenRefresh()

Вызывается, когда система определяет, что токены необходимо обновить. Приложение должно вызывать getToken() и отправлять токены на все серверы приложений. Это не будет вызвано очень часто, оно необходимо для поворота ключа и обработки особых случаев. Система активирует событие обновления на всех устройствах, чтобы избежать перегрузки серверов приложений с обновлениями токенов.

Итак, как вы начинаете обновление токена с сервера, это вне меня! Но в ответ на ваш вопрос - да, вам все равно нужно обрабатывать клиентскую часть обновления токена!

EDIT: интересно читать Обработка изменений идентификатора регистрации в облачных сообщениях Google на Android