2015-08-23 3 views
7

Попытка реализовать последние GCM сервисов Google. Я прочитал GCM documentation. Я также скачал & проанализирован google's sample implementation. Из всего вышесказанного я понял следующее:Смутно о процессе обновления токена GCM

  1. InstanceId услуги предоставляют API-интерфейсы для создания gcm registration tokens Вы отправляете & магазин этот сгенерированный маркер в вашем приложении сервера.
  2. Эти жетоны могут меняться время от времени с клиентской стороны, а также со стороны сервиса instanceId, как указано here. Чтобы справиться с этим, вы должны реализовать InstanceIDListenerService и провайдер InstanceID будет называть onTokenRefresh где вы просто написать логику, чтобы получить новый маркер и отправляет его на сервер (Google's sample app)
  3. Там что-то называется canonical_id (as mentioned here) (который является последней registration_id отправить с устройства), что сервер GCM отправляет ваше устройство, если ваш сервер приложений отправляет более старый идентификатор регистрации. Вы должны заменить существующий токен на сервере этим canonical_id.

Теперь, следующие мои вопросы:

  1. InstanceId.getToken кажется вернуть тот же маркер, если приложение не удаляется и возвращается довольно быстро, если маркер не изменился. Итак, могу ли я позвонить RegistrationIntentService каждый раз, когда я запускаю приложение? Таким образом, я гарантированно буду работать с последним токеном все время.
  2. Как обновляется onTokenRefresh, если обновление происходит, когда ваше приложение не подключено к магазину воспроизведения (нет Интернета или что-то еще)? Повторяет ли InstanceId провайдер? Это где-то документально? Что произойдет, если в то же время отправлено push-уведомление?
  3. Что такое canonical_id? это последний токен, сгенерированный для устройства (инициированный InstanceID.getToken у клиента или на конец InstanceId)? Если canonical_id действительно является последним маркером gcm, то зачем нужна реализация onTokenRefresh, так как вы можете в любом случае проанализировать данные push-уведомления и обновить сервер приложений, если вы найдете canonical_id?

ответ

4

Можно ли вызвать службу RegistrationIntentService каждый раз, когда я запускаю приложение?

Лучшим решением было бы сохранить предпочтение тем, что вам уже удалось зарегистрировать токен. start RegistrationIntentService только если вы еще не зарегистрировались.

String token = InstanceID.getToken(...); 
//send to server 
getSharedPreferences(context).edit().putBoolean(PREFIX_PREF_GCM_KEY, true).apply(); 

тогда, когда вы начинаете ваше приложение просто проверить, если PREFIX_PREF_GCM_KEY верно

Как работает onTokenRefresh если обновление происходит в то время как ваше приложение не подключен к магазину игры (нет интернета или что-то)

Я предполагаю, что это до системы, чтобы назвать это refresh procedure. в документации указано:

Вызывается, когда система определяет, что токены необходимо обновить.Приложение должно вызывать getToken() и отправлять токены на все серверы приложений. Это не будет вызвано очень часто, оно необходимо для поворота ключа и обработки особых случаев. Система будет дросселировать событие обновления на всех устройствах, чтобы избежать перегрузки серверов приложений с обновлениями токенов.

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

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

Что такое canonical_id?

Вполне возможно, что по ошибке вы зарегистрировали несколько регистрационных идентификаторов для одного устройства в вашего сервера - например - onRefreshToken - зарегистрированный маркер без удаления старого. Если вы отправите сообщение, используя старый registartaion_id, Google даст вам знать, вы должны изменить его на новый один - canonical_id

+0

спасибо! Я понимаю, что вы можете хранить внутри 'sharedpreferences', поскольку я делаю это для моего старого GCM API (' GCM.register'). Однако теперь я смущен этим обновлением токенов. Мой основной вопрос: посылает ли canonical_id то же самое, что и последний токен этого устройства. Потому что, если это так, не может быть необходимости в реализации onRefreshToken в целом. – ranjjose

+1

Почему бы и нет? Это процесс, который позволяет решать проблемы до их возникновения (обновление токена перед использованием старого). – royB

+0

В соответствии с документами, если вы обнаружите 'registration_id' в ответе gcm, это означает, что токен регистрации, который у вас на сервере приложений устарел, и его следует заменить на регистрационный_ID. Моя проблема в том, что (1) 'InstanceID service' решает обновить токен и называет вашу реализацию' onRefreshToken', и там вы все равно будете называть InstanceID.getToken' и обновленную базу данных сервера. Как только обновление будет завершено, ваш сервер приложений будет иметь последние токены. С этого момента я не могу найти случай, когда вы найдете 'registration_id' в ответе gcm. (cont.d) – ranjjose

Смежные вопросы