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

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

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

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

Это верно.

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

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

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

Согласно документации InstanceID :

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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