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

Когда заканчиваются токены GCM и что такое идентификатор экземпляра?

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Идентификатор экземпляра присваивается момент, когда мое приложение переходит в сеть?

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

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

В соответствии с Документация по экземплярам:

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

  • Приложение удаляет идентификатор экземпляра
  • Устройство factory reset
  • Пользователь удаляет приложение
  • Пользователь удаляет данные приложения.

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

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

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

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

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

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

Когда истекают эти идентификаторы и токены? Они истекают?

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

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

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

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

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

Руководство

Ответ 2

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

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

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

Ответ 3

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

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

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

Основные функции

  • Создание токенов безопасности
  • Проверить подлинность приложения
  • Подтверждение активного приложения
  • Идентифицировать и отслеживать приложения

Жизненный цикл идентификатора экземпляра

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

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

  • Приложение удаляет идентификатор экземпляра
  • Устройство factory reset
  • Пользователь удаляет приложение
  • Пользователь удаляет данные приложения.

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

Когда обновлять токены?

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

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

Все, что вам нужно знать о Instance ID, можно найти в следующих официальных ссылках: