Когда истекает срок действия токенов GCM и каков InstanceID?
Поскольку GCM постоянно обновляется, большинство ресурсов, которые я искал, кажутся устаревшими или неясными. По сути, я запутался, когда истекает срок действия токенов и ID. (Для справки, я работаю с 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 и Token, что кажется простым, но тогда старые остаются активными? Как стереть старые токены с сервера? Кажется, есть простой способ сделать это с APNS на стороне iOS, где вы можете получить список всех просроченных токенов и просто стереть их из своей базы данных.
3 ответа
Я обнаружил, что задаю большинство этих вопросов сам, когда обновляю свою реализацию GCM. После того, как я возился с ним несколько дней, вот мой ответ на ваши вопросы.
Из того, что я понимаю (и, пожалуйста, исправьте меня, если я ошибаюсь), мой сервер имеет ключ API и идентификатор отправителя. Используя идентификатор отправителя, я могу попросить клиента запросить токен через InstanceID, который хранится локально на моем клиенте.
Это правильно.
InstanceID назначается в тот момент, когда мое приложение выходит в сеть?
Похоже, что он назначен, как только ваше приложение запускается, даже если устройство не может получить доступ к Интернету.
Это когда-нибудь меняется? Что делать, когда приложение обновляется или удаляется и переустанавливается (или устройство восстанавливается)? При вызове InstanceID.getInstance я всегда получу один и тот же InstanceID или он в конце концов истечет и выдаст мне новый?
Согласно документации InstanceID:
Идентификатор экземпляра стабилен, но может стать недействительным, если:
- Приложение удаляет идентификатор экземпляра
- Устройство сброшено на заводские настройки
- Пользователь удаляет приложение
- Пользователь очищает данные приложения
Если идентификатор экземпляра стал недействительным, приложение может вызвать getId () для запроса нового идентификатора экземпляра.
Я протестировал удаление приложения и очистку данных, и результаты показывают, что все вышесказанное соответствует действительности.
Есть ли какое-либо значение для хранения строки, которую вы извлекаете, вызывая getID()?
Похоже, API обрабатывает сохранение этого в локальном хранилище вашего приложения для вас.
Используя InstanceID, мой клиент может запросить токен с серверов GCM, который затем отправляет на сервер приложений. Мой сервер приложений хранит этот токен и может использовать его для отправки сообщений на серверы GCM, которые затем отправят сообщение на устройство. Я полагаю, что устройство использует сохраненный InstanceID для фактического получения этих сообщений. Итак, наличие класса, расширяющего GcmListenerService, позволит мне получать эти сообщения с помощью onMessageReceived? Мне не нужно делать ничего особенного (кроме определения в AndroidManifest)? Мне не нужно на самом деле сказать, чтобы использовать InstanceID? Это просто волшебно знает?
Насколько я могу судить, в предыдущей реализации не было никакого InstanceId, и не похоже, что в этом он явно используется. Если это так, он вызывается в GcmReceiver или GcmListenerService.
Когда истекает срок действия этих идентификаторов и токенов? Они истекают?
Я уже говорил об истечении срока действия идентификатора, и мы можем узнать об истечении срока действия токенов в руководстве по внедрению Android InstanceID:
Служба Instance ID периодически инициирует обратные вызовы (например, каждые 6 месяцев), запрашивая, чтобы ваше приложение обновляло свои токены. Он также может инициировать обратные вызовы, когда:
- Есть проблемы с безопасностью; например, проблемы с SSL или платформой.
- Информация об устройстве больше не действительна; например, резервное копирование и восстановление.
- В противном случае это влияет на службу Instance ID.
В руководстве говорится, чтобы создать подкласс InstanceIDListenerService и переопределить onTokenRefresh()
чтобы справиться с этими сценариями.
Я храню токен в виде строки на сервере, но если в какой-то момент срок действия одного из них истекает, как я узнаю, что срок его действия истек?
В руководстве по внедрению GCM на вашем сервере говорится, что сервер GCM ответит на ваш сервер некоторой информацией о токене, который вы использовали для отправки push-уведомления.
Я всегда могу сгенерировать новый InstanceID и Token, что кажется простым, но тогда старые остаются активными?
Мои тесты показывают, что да, они делают.
Как стереть старые токены с сервера? Кажется, есть простой способ сделать это с APNS на стороне iOS, где вы можете получить список всех просроченных токенов и просто стереть их из своей базы данных.
Я все еще смотрю на это и буду обновлять, если я смогу кое-что выяснить.
@pumpkinpie65 и @B. Вот что я сделал, чтобы обнаружить недействительные токены в моей базе данных.
при отправке уведомления пользователю / списку пользователей в GCM есть опция "пробный запуск". Когда вы устанавливаете пробный запуск при отправке уведомлений, он не оповещает клиентов и не показывает им уведомления, а возвращает ответ о том, какие токены действительны (200), а какие нет.
Если вы отправите уведомление 200 пользователям, используя опцию пробного запуска, то в том же порядке вы получите ответ от GCM.
Что такое идентификатор экземпляра?
ID экземпляра предоставляет уникальный идентификатор для каждого экземпляра ваших приложений. Вы можете реализовать Instance ID для приложений Android и iOS, а также приложений / расширений Chrome.
Помимо предоставления уникальных идентификаторов для аутентификации, Instance ID может генерировать токены безопасности для использования с другими службами.
Ключевая особенность
- Генерация токенов безопасности
- Проверить подлинность приложения
- Подтвердите, что приложение активно
- Определять и отслеживать приложения
Жизненный цикл идентификатора экземпляра
- Служба Instance ID выдает InstanceID, когда ваше приложение подключается к сети. InstanceID поддерживается парой открытого / секретного ключей с закрытым ключом, хранящимся на локальном устройстве, и открытым ключом, зарегистрированным в сервисе Instance ID.
- Ваше приложение может запросить новый InstanceID всякий раз, когда это необходимо, используя метод getID(). Ваше приложение может хранить его на вашем сервере, если у вас есть приложение, которое поддерживает ваше приложение.
- Ваше приложение может запрашивать токены из службы Instance ID по мере необходимости, используя метод getToken(), и, как и InstanceID, ваше приложение также может хранить токены на вашем собственном сервере. Все токены, выпущенные для вашего приложения, принадлежат InstanceID приложения.
- Токены являются уникальными и безопасными, но вашему приложению или службе Instance ID может потребоваться обновить токены в случае проблем с безопасностью или когда пользователь удаляет и переустанавливает ваше приложение во время восстановления устройства. Ваше приложение должно реализовать прослушиватель для ответа на запросы обновления токена от службы Instance ID.
Когда идентификатор экземпляра становится недействительным?
- Приложение удаляет идентификатор экземпляра
- Устройство сброшено на заводские настройки
- Пользователь удаляет приложение
- Пользователь очищает данные приложения
Если идентификатор экземпляра стал недействительным, приложение может вызвать getId() для запроса нового идентификатора экземпляра. Чтобы подтвердить право собственности на Instance ID и разрешить серверам получать доступ к данным или службам, связанным с приложением, вызовите getToken(String, String).
Когда обновлять токены?
Служба Instance ID периодически инициирует обратные вызовы (например, каждые 6 месяцев), запрашивая, чтобы ваше приложение обновляло свои токены. Он также может инициировать обратные вызовы, когда:
Есть проблемы с безопасностью; например, проблемы с SSL или платформой. Информация об устройстве больше не действительна; например, резервное копирование и восстановление. В противном случае это влияет на службу Instance ID.
Все, что вам нужно знать об ID экземпляра, можно найти по следующим официальным ссылкам: