由于GCM不断更新,因此我搜索的大多数资源似乎已经过时或不清楚。基本上,我对 token 和ID何时过期感到困惑。 (供引用,我正在使用Android。)

据我了解(如果我错了,请纠正我),我的服务器具有一个API key 和一个发件人ID。使用发件人ID,我可以让客户端通过本地存储在客户端上的InstanceID来请求 token 。我已经有点困惑了。我的应用程序上线后立即分配InstanceID?它会改变吗?当应用程序升级或卸载并重新安装(或设备已还原)时,该怎么办?通过调用InstanceID.getInstance,我将始终检索相同的InstanceID,还是最终失效并给我一个新的InstanceID?通过调用getID()来存储检索到的字符串是否有任何值(value)?该文档似乎表明您实际上在调用getID()时检索了一个新的InstanceID,从而使事情更加复杂。 (作为引用,我指的是https://developers.google.com/instance-id/)

使用InstanceID,我的客户端可以从GCM服务器请求 token ,然后将其发送到我的应用服务器。我的应用服务器存储了此 token ,并且可以使用它来将消息发送到GCM服务器,然后GCM服务器会将消息发送到设备。我相信,该设备使用存储的InstanceID实际接收这些消息。因此,拥有一个扩展GcmListenerService的类将使我可以使用onMessageReceived接收这些消息吗?我不需要做任何特别的事情(除了在AndroidManifest中定义它)?我不必实际告诉它使用InstanceID吗?它只是神奇地知道吗?

这些ID和 token 何时过期?他们会过期吗?我将 token 作为字符串存储在服务器上,但是如果其中任何一个过期,我如何知道它们已过期?我总是可以生成一个新的InstanceID和Token,这似乎很容易,但是旧的仍然保持 Activity 状态吗?如何清除服务器上的旧 token ?在iOS方面,使用APNS似乎有一种简便的方法,您可以在其中检索所有已过期 token 的列表,然后从数据库中擦除它们。

最佳答案

我发现自己在更新GCM实现时会问这些问题中的大多数。经过几天的讨论,这是我对您的问题的看法。

这是对的。

即使设备无法访问互联网,它似乎也已在您的应用启动后立即被分配。

根据InstanceID documentation:

我已经测试了卸载应用程序并清除数据,结果表明上述所有内容都是正确的。

看起来API会为您处理将其存储在应用程序的本地存储中。

据我所知,在先前的实现中没有任何InstanceId,并且看起来也不像在此实例中明确使用了它。如果是,则在GcmReceiverGcmListenerService中调用它。

我已经解决了ID的过期问题,我们可以在Android InstanceID implementation guide中找到有关 token 过期的信息:

该指南介绍了InstanceIDListenerService的子类,并覆盖了onTokenRefresh()来处理这些情况。

guide for implementing GCM on your server表示,GCM服务器将使用有关您用于尝试发送推送通知的 token 的信息来响应您的服务器。

我的测试表明,可以。

我仍在调查中,如果可以找出答案,将会进行更新。

09-25 17:12