GCM 3.0需要刷新注册令牌吗?

18

在最新的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);

那个关于操作系统更新/重启的建议是错误的,正如Android框架工程师Dianne Hackborn在评论中所述。 - beetstra
所以..现在我们需要实现的唯一事情就是onTokenRefresh()方法(和Service)。对吧? 服务器应该定期更新gcm,这将调用回调函数。对吧? :) - guy_m
2个回答

19

注册令牌在重新启动后不应该刷新,但还有其他情况可能会导致它刷新,因此您需要处理它。

使用更新的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令牌已过期)。
- 如果客户端应用程序已更新但新版本未配置为接收消息。

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

为了保护客户端应用程序和应用程序服务器免受潜在的恶意重用注册令牌,请定期从服务器初始化令牌刷新。当从服务器端启动GCM注册令牌刷新时,客户端应用程序必须处理带有GCM注册客户端/服务器握手的tokenRefreshed消息。
请参阅API参考文档以获取有关标识和令牌刷新过程的更多信息。


如何从服务器启动令牌刷新?有文档链接吗? - CzBiX
@CzBiX 是的,你通常使用的发送通知的方法。只是在这种情况下,你会发送一个带有一些标志/内容的通知,在应用内进行处理,并基于此告诉 InstanceID 注销先前的令牌并获取一个新的令牌,然后将其发送回服务器。 - Alex Bitek
2
谢谢!但是在 GCM 的 文档 中,不推荐注销。还有其他更好的方法吗? - CzBiX
@CzBiX 不,那是最好的方法。 - Alex Bitek

2

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

从服务器的角度来看,这并不是很清楚。

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

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

哎呀,那里没有API参考链接-因此,在这里查看服务器APIhttps://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()并将令牌发送到所有应用程序服务器。这不会经常发生,它需要进行密钥轮换并处理特殊情况。系统将跨所有设备限制刷新事件,以避免向应用程序服务器发送令牌更新。

因此,我不知道如何从服务器启动令牌刷新!但是回答你的问题-是的,您仍然需要在客户端处理令牌刷新!

编辑:有趣的阅读Handling registration ID changes in Google Cloud Messaging on Android


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接