是否需要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); 

  • XMPP(Openfire)推送通知Android
  • Google Cloud Messaging(GCM)使用哪种端口和协议?
  • 如何为GCM创建API密钥?
  • Lint抱怨没有翻译gcm_defaultSenderId字符串
  • 有没有理由使用Google GCM和Apple消息进行推送通知?
  • 在GCM客户端上接收推送通知的问题
  • GCM取消注册导致应用程序崩溃
  • 在onHandleIntent()中,Intent怎么可能为null?
  • 注册令牌在重新启动后不应刷新,但在其他情况下可能会刷新,因此您需要处理它。

    使用更新的API,您需要实现InstanceIDListenerService以便处理令牌刷新,如google-services中所示#smax #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); } 

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

    • 检查https://developers.google.com/cloud-messaging/server-ref#error-codes ,未注册的设备错误说明:

    现有的注册令牌在许多场景中可能不再有效,包括:
    – 如果客户端应用程序取消注册GCM。
    – 如果客户端应用程序自动取消注册,则可能会在用户卸载应用程序时发生。 例如,在iOS上,如果APNS反馈服务将APNS令牌报告为无效。
    – 如果注册令牌过期(例如,Google可能决定刷新注册令牌,或者iOS设备的APNS令牌已过期)。
    – 如果客户端应用程序已更新,但新版本未配置为接收消息。

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

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

    为了保护客户端应用和应用服务器免受潜在的恶意重用注册令牌,您应该定期从服务器启动令牌刷新。 从服务器端启动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字段

    可选字符串,指定处理和发送消息的客户端应用程序的规范注册令牌。 发件人应使用此值作为将来请求的注册令牌。 否则,邮件可能会被拒绝。

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

    当系统确定需要刷新令牌时调用。 应用程序应调用getToken()并将令牌发送到所有应用程序服务器。 这不会经常调用,需要进行键旋转和处理特殊情况。 系统将限制所有设备上的刷新事件,以避免使用令牌更新使应用程序服务器过载。

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

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