Когда истекает срок действия токенов GCM и что такое InstanceID?

поскольку GCM продолжает обновляться, большинство ресурсов, которые я искал, кажутся устаревшими или неясными. В принципе, я запутался, когда истекает срок действия токенов и идентификаторов. (Для справки, я работаю с Android.)

из того, что я понимаю (и, пожалуйста, поправьте меня, если я ошибаюсь), мой сервер имеет ключ API и идентификатор отправителя. Используя идентификатор отправителя, я могу попросить моего клиента запросить токен через InstanceID, хранящийся локально на моем клиенте. Я уже немного запутался. В instanceid-это назначенный момент, когда мое приложение выходит в интернет? Она когда-нибудь меняется? Как насчет того, когда приложение обновляется или удаляется и переустанавливается (или устройство восстанавливается)? Позвонив в InstanceID.getInstance я всегда буду получать один и тот же InstanceID, или он в конечном итоге истечет и даст мне новый? Есть ли значение для хранения строки, которую вы получаете, вызывая getID ()? Документы, похоже, указывают, что вы фактически получаете новый InstanceID при вызове getID (), так что это еще больше усложняет ситуацию. (Для ссылка, я имею в виду: https://developers.google.com/instance-id/)

используя InstanceID, мой клиент может запросить токен с серверов GCM, который он затем отправляет на мой сервер приложений. Мой сервер приложений хранит этот маркер и может использовать его для отправки сообщений на серверы GCM, которые затем отправят сообщение на устройство. Я считаю, что устройство использует сохраненный InstanceID для фактического получения этих сообщений. Поэтому иметь класс, который расширяет GcmListenerService позволит мне получать эти сообщения с onMessageReceived? Мне не нужно делать ничего особенного (кроме определения его в AndroidManifest)? Мне не нужно на самом деле говорить ему использовать InstanceID? Он просто волшебным образом знает?

когда истекает срок действия этих идентификаторов и токенов? У них есть срок годности? Я храню токен как строку на сервере, но если в какой-то момент один из них истекает, как я могу знать, что они истекли? Я всегда могу создать новый InstanceID и токен, это кажется легким, но затем сделайте старые остаются активными? Как стереть старые токены с сервера? Кажется, есть простой способ сделать это с APNS на стороне iOS вещей, где вы можете получить список всех истекших токенов и просто стереть их из своей базы данных.

3 ответов


Я обнаружил, что задаю большинство этих вопросов сам, когда я обновляю свою реализацию GCM. После возиться с ним несколько дней, вот мой взгляд на ваши вопросы.

из того, что я понимаю (и, пожалуйста, поправьте меня, если я ошибаюсь), мой сервер имеет ключ API и идентификатор отправителя. Используя идентификатор отправителя, я могу попросить моего клиента запросить токен через InstanceID, хранящийся локально на моем клиенте.

это правильно.

InstanceID назначается момент, когда мое приложение выходит в интернет?

похоже, он назначен, как только приложение запускается, даже если устройство не может получить доступ к интернету.

это когда-нибудь изменится? Как насчет того, когда приложение обновляется или удаляется и переустанавливается (или устройство восстанавливается)? Позвонив в InstanceID.getInstance я всегда буду получать один и тот же InstanceID, или он в конечном итоге истечет и даст мне новый?

по документация по InstanceID:

идентификатор экземпляра стабилен, но может стать недействительным, если:

  • App удаляет идентификатор экземпляра
  • устройства сброс
  • пользователь удаляет приложение
  • пользователь очищает данные приложения

если идентификатор экземпляра стал недопустимым, приложение может вызвать getId (), чтобы запросить новый идентификатор экземпляра.

я протестировал удаление приложения и очистку данные и результаты указывают на то, что все вышеперечисленное верно.

есть ли значение для хранения строки, которую вы извлекаете, вызывая getID ()?

похоже, что API обрабатывает это в локальном хранилище вашего приложения для вас.

используя InstanceID, мой клиент может запросить токен с серверов GCM, который он затем отправляет на мой сервер приложений. Мой сервер приложений хранит этот маркер и может использовать его для отправки сообщений на серверы GCM, который затем отправит сообщение на устройство. Я считаю, что устройство использует сохраненный InstanceID для фактического получения этих сообщений. Поэтому иметь класс, который расширяет GcmListenerService позволит мне получать эти сообщения с onMessageReceived? Мне не нужно делать ничего особенного (кроме определения его в AndroidManifest)? Мне не нужно на самом деле говорить ему использовать InstanceID? Он просто волшебным образом знает?

насколько я могу судить, не было никакого InstanceId в предыдущая реализация, и не похоже, что она явно используется в этом. Если это так, то он вызывается в любом GcmReceiver или GcmListenerService.

когда и жетоны эти документы действительны? У них есть срок годности?

Я уже обратился к истечению ID, и мы можем узнать о токенах, истекающих в руководство по реализации Android InstanceID:

служба ID экземпляра периодически инициирует обратные вызовы (например, каждые 6 месяцев), запрашивая обновление маркеров приложения. Он также может инициировать обратные вызовы, когда:

  • существуют проблемы безопасности; например, проблемы SSL или платформы.
  • информация об устройстве больше не действует; например, резервное копирование и восстановление.
  • идентификатор экземпляра сервиса иначе затронуты.

руководство говорит подкласс InstanceIDListenerService и переопределить onTokenRefresh() для обработки таких ситуаций.

Я храню токен как строку на сервере, но если в любой момент один из них истекает, как я могу знать, что они истекли?

на руководство по реализации GCM на вашем сервере говорит, что сервер GCM ответит на ваш сервер некоторой информацией о токене, который вы использовали для отправки push-уведомления.

Я всегда могу создать новый InstanceID и токен, это кажется легким, но тогда старые остаются активными?

мои тесты показывают, что да, они делают.

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

Я все еще изучаю это и буду обновите, если я смогу что-то выяснить.


@pumpkinpie65 и @B. Roth вот что я сделал, чтобы обнаружить недопустимые токены в моей базе данных.

в GCM есть опция "dry run" при отправке уведомления пользователю/списку пользователей. Когда вы устанавливаете dry-run во время отправки уведомлений, он не предупреждает клиентов или не показывает им уведомления, но возвращает ответ о том, какие токены действительны(200), а какие нет.

Если вы отправляете уведомление 200 пользователям с использованием опции dry-run, то в том же порядке вы будете получите ответ от GCM.


Что такое идентификатор экземпляра?

Instance ID предоставляет уникальный идентификатор для каждого экземпляра ваших приложений. Вы можете реализовать идентификатор экземпляра для приложений Android и iOS, а также приложений/расширений Chrome.

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

Основные Возможности

  • Генерировать Маркеры Безопасности
  • проверка подлинности приложения
  • подтвердить приложение устройства это активный
  • идентифицировать и отслеживать приложения

жизненный цикл ID экземпляра

  1. служба идентификатора экземпляра выдает InstanceID, когда ваше приложение выходит в сеть. InstanceID поддерживается парой открытого и закрытого ключей с закрытым ключом, хранящимся на локальном устройстве, и открытым ключом, зарегистрированным в службе ID экземпляра.
  2. ваше приложение может запросить свежий InstanceID, когда это необходимо, используя метод getID (). Приложение может хранить его на сервере если у вас есть один, который поддерживает ваше приложение.
  3. ваше приложение может запрашивать маркеры из службы идентификатора экземпляра по мере необходимости с помощью метода getToken (), и, как InstanceID, ваше приложение также может хранить маркеры на вашем собственном сервере. Все маркеры, выданные вашему приложению, принадлежат InstanceID приложения.
  4. маркеры уникальны и безопасны, но ваше приложение или служба идентификатора экземпляра могут потребоваться обновить маркеры в случае проблемы безопасности или когда пользователь удаляет и переустановит приложение во время устройства восстановление. Приложение должно реализовать прослушиватель для ответа на запросы обновления маркеров из службы идентификаторов экземпляров.

когда идентификатор экземпляра становится недействительным?

  • App удаляет идентификатор экземпляра
  • устройства сброс
  • пользователь удаляет приложение
  • пользователь очищает данные приложения

если идентификатор экземпляра стал недействительным, приложение может вызвать getId (), чтобы запросить новый идентификатор экземпляра. Доказать право собственности на экземпляр ID и разрешить серверам доступ к данным или службам, связанным с приложением, вызовите getToken (строка, строка).

когда обновить ключи?

служба идентификаторов экземпляров периодически инициирует обратные вызовы (например, каждые 6 месяцев), запрашивая обновление токенов приложения. Он также может инициировать обратные вызовы, когда:

существуют проблемы безопасности; например, проблемы SSL или платформы. Информация об устройстве больше не действительна; например, резервное копирование и восстановление. Этот В противном случае затрагивается служба ID экземпляра.

все, что вам нужно знать об идентификаторе экземпляра, можно найти по следующим официальным ссылкам: