GCM 3.0刷新注册令牌需要?

使用最新的GCM更新(3.0),在重启等情况下是否需要刷新注册令牌? 本文讨论使GCM可靠,并涵盖注册令牌可以更改的几个条件。 在最新的版本中这些步骤是否必要? 在IO 2015年的演讲中,他们谈到好像注册令牌是好的,直到应用程序从设备上卸载。

InstanceID instanceID = InstanceID.getInstance(this); String token = instanceID.getToken(getString(R.string.gcm_defaultSenderId), GoogleCloudMessaging.INSTANCE_ID_SCOPE, null); 

Solutions Collecting From Web of "GCM 3.0刷新注册令牌需要?"

重新启动后注册令牌不应该刷新,但是在其他情况下可能会刷新注册令牌,所以您需要处理它。

使用更新后的API,您需要实现一个InstanceIDListenerService以处理令牌刷新,如google-services#android#gcm示例应用程序

  /** * Called if InstanceID token is updated. This may occur if the security of * the previous token had been compromised. This call is initiated by the * InstanceID provider. */ // [START refresh_token] @Override public void onTokenRefresh() { // Fetch updated Instance ID token and notify our app's server of any changes (if applicable). Intent intent = new Intent(this, RegistrationIntentService.class); startService(intent); } 

关于可能发生令牌刷新的其他情况。

现有注册令牌可能会在多种情况下停止有效,其中包括:
– 如果客户端应用程序取消注册GCM。
– 如果客户端应用程序自动注销,如果用户卸载应用程序可能会发生这种情况。 例如,在iOS上,如果APNS反馈服务报告APNS令牌无效。
– 如果注册令牌过期(例如,Google可能决定刷新注册令牌,或者iOS设备的APNS令牌已过期)。
– 如果客户端应用程序已更新,但新版本未configuration为接收消息。

对于所有这些情况,请从应用程序服务器中删除此注册令牌,并停止使用它来发送消息。

  • 根据https://stackoverflow.com/a/16839326/313113 (从编辑04.24.2014),似乎有一个错误,当用户升级应用程序,你发送升级发生在同一时间的通知,令牌获取未注册,所以你必须在应用程序升级后再次注册。 (不知道是否仍然如此)
  • 备份/恢复操作后令牌刷新
  • 保持注册状态同步的文档甚至build议定期从服务器进行令牌刷新,出于安全原因:

为了保护客户端应用程序和应用程序服务器免受注册令牌的潜在恶意重用,您应该定期从服务器启动令牌刷新。 当从服务器端启动GCM注册令牌刷新时,客户端应用程序必须使用GCM注册客户端/服务器握手来处理tokenRefreshed消息
有关身份和令牌刷新过程的更多信息,请参阅API参考。

编辑:签出InstanceID文档,因为这显示如何处理令牌刷新。 https://developers.google.com/instance-id/和https://developers.google.com/instance-id/guides/android-implementation

从服务器PoV imho不是很清楚。

https://developers.google.com/cloud-messaging/registration#keeping-the-registration-state-in-sync我们有

为了保护客户端应用程序和应用程序服务器免受注册令牌的潜在恶意重用,您应该定期从服务器启动令牌刷新。 当从服务器端启动GCM注册令牌刷新时,客户端应用程序必须使用GCM注册客户端/服务器握手来处理tokenRefreshed消息。 有关身份和令牌刷新过程的更多信息,请参阅API参考。

嗯,没有链接那里的API参考 – 所以看看服务器API在这里https://developers.google.com/cloud-messaging/server-ref#interpret-downstream我们有一个canonical_ids字段是

包含规范注册令牌的结果数量。 请参阅注册概述以获取有关此主题的更多讨论。

和一个results字段

可选string,指定处理并发送消息的客户端应用程序的规范注册标记。 发件人应将此值用作未来请求的注册标记。 否则,这些消息可能会被拒绝。

对于客户端我们有新的https://developers.google.com/android/reference/com/google/android/gms/iid/InstanceIDListenerService.html#onTokenRefresh()

当系统确定令牌需要刷新时调用。 应用程序应调用getToken()并将令牌发送到所有应用程序服务器。 这不会被称为非常频繁,这是需要密钥轮换和处理特殊情况。 系统将限制所有设备上的刷新事件,以避免使用令牌更新过载应用程序服务器。

所以如何从服务器启动令牌刷新超出了我! 但在回答你的问题 – 是的,你仍然需要处理令牌刷新客户端!

编辑:有趣的阅读在Android上处理Google Cloud Messaging中的注册ID更改