2016-02-12 77 views
4

我正在关注官方指南中的GCM-Android集成示例。GCM令牌刷新以及何时将令牌发送到服务器

我尤其感到困惑在上面链接类下面几行:

// You should store a boolean that indicates whether the generated token has been 
// sent to your server. If the boolean is false, send the token to your server, 
// otherwise your server should have already received the token. 

现在我所说的目的服务的,每次我的主要活动的推出,我相信,实例ID是负责发起令牌刷新。

每次从我的主要活动启动此GCM注册意向时,我应该检查Shared Prefs值。但是在这种情况下刷新将失败,因为在初始令牌获取之后,条件将始终为真。

我应该放弃共享prefs逻辑 - 这种方式每次都会将新的令牌发送到我的服务器。这样做的正确方法是什么?令牌如何刷新worrk以及它何时刷新?

回答

5

是的,你不需要将它保存在sharedPreference中。为了保护客户端应用程序和应用程序服务器免受注册令牌的潜在恶意重用,您应该定期从服务器启动令牌刷新。当从服务器端启动GCM注册令牌刷新时,客户端应用程序必须使用GCM注册客户端/服务器握手来处理tokenRefreshed消息。

根据document,备份Google Cloud Messaging注册返回的注册令牌可能会导致已恢复应用的通知出现意外行为。这是因为,当用户将您的应用安装在新设备上时,应用必须向GCM API查询新的注册令牌。如果旧注册存在,因为系统已将其备份并恢复,则该应用程序不会查找新的令牌。为防止出现此问题,请从备份文件集中排除注册令牌。

下面是谷歌服务演示应用程序 - MyInstanceIDListenerService:https://github.com/googlesamples/google-services/blob/master/android/gcm/app/src/main/java/gcm/play/android/samples/com/gcmquickstart/MyInstanceIDListenerService.java#L38

欲了解更多信息,请阅读谷歌官方文档在这里:https://developers.google.com/cloud-messaging/registration

+0

“你应该定期发起令牌刷新” - 如何往往是周期性我不知道?!也许每天一次? –

+0

我一直在寻找这一段时间,而且你不需要手动定期刷新,实际上'InstanceIDListenerService'的'onRefreshToken()'回调函数是你需要注意的唯一函数 - 于是你要求一个新的令牌并更新你的服务器。但重要的是,这个回调是由系统本身自动启动的(我认为) –