Попытка реализовать последние GCM
сервисов Google. Я прочитал GCM documentation. Я также скачал & проанализирован google's sample implementation. Из всего вышесказанного я понял следующее:Смутно о процессе обновления токена GCM
InstanceId
услуги предоставляют API-интерфейсы для созданияgcm registration tokens
Вы отправляете & магазин этот сгенерированный маркер в вашем приложении сервера.- Эти жетоны могут меняться время от времени с клиентской стороны, а также со стороны сервиса instanceId, как указано here. Чтобы справиться с этим, вы должны реализовать
InstanceIDListenerService
и провайдер InstanceID будет называтьonTokenRefresh
где вы просто написать логику, чтобы получить новый маркер и отправляет его на сервер (Google's sample app) - Там что-то называется
canonical_id
(as mentioned here) (который является последней registration_id отправить с устройства), что сервер GCM отправляет ваше устройство, если ваш сервер приложений отправляет более старый идентификатор регистрации. Вы должны заменить существующий токен на сервере этим canonical_id.
Теперь, следующие мои вопросы:
InstanceId.getToken
кажется вернуть тот же маркер, если приложение не удаляется и возвращается довольно быстро, если маркер не изменился. Итак, могу ли я позвонитьRegistrationIntentService
каждый раз, когда я запускаю приложение? Таким образом, я гарантированно буду работать с последним токеном все время.- Как обновляется
onTokenRefresh
, если обновление происходит, когда ваше приложение не подключено к магазину воспроизведения (нет Интернета или что-то еще)? Повторяет лиInstanceId
провайдер? Это где-то документально? Что произойдет, если в то же время отправлено push-уведомление? - Что такое
canonical_id
? это последний токен, сгенерированный для устройства (инициированныйInstanceID.getToken
у клиента или на конецInstanceId
)? Еслиcanonical_id
действительно является последним маркером gcm, то зачем нужна реализацияonTokenRefresh
, так как вы можете в любом случае проанализировать данные push-уведомления и обновить сервер приложений, если вы найдетеcanonical_id
?
спасибо! Я понимаю, что вы можете хранить внутри 'sharedpreferences', поскольку я делаю это для моего старого GCM API (' GCM.register'). Однако теперь я смущен этим обновлением токенов. Мой основной вопрос: посылает ли canonical_id то же самое, что и последний токен этого устройства. Потому что, если это так, не может быть необходимости в реализации onRefreshToken в целом. – ranjjose
Почему бы и нет? Это процесс, который позволяет решать проблемы до их возникновения (обновление токена перед использованием старого). – royB
В соответствии с документами, если вы обнаружите 'registration_id' в ответе gcm, это означает, что токен регистрации, который у вас на сервере приложений устарел, и его следует заменить на регистрационный_ID. Моя проблема в том, что (1) 'InstanceID service' решает обновить токен и называет вашу реализацию' onRefreshToken', и там вы все равно будете называть InstanceID.getToken' и обновленную базу данных сервера. Как только обновление будет завершено, ваш сервер приложений будет иметь последние токены. С этого момента я не могу найти случай, когда вы найдете 'registration_id' в ответе gcm. (cont.d) – ranjjose