28

由于 GCM 不断更新,我搜索过的大部分资源似乎都已过时或不清楚。基本上,我对令牌和 ID 何时到期感到困惑。(作为参考,我正在使用 Android。)

据我了解(如果我错了,请纠正我),我的服务器有一个 API 密钥和一个发件人 ID。使用发件人 ID,我可以让我的客户通过本地存储在我的客户端上的 InstanceID 请求令牌。我已经有点困惑了。InstanceID 是在我的应用上线时分配的?它会改变吗?当应用程序升级或卸载并重新安装(或设备恢复)时怎么办?通过调用 InstanceID.getInstance,我将始终检索相同的 InstanceID,还是它最终会过期并给我一个新的?通过调用 getID() 存储您检索的字符串是否有任何价值?文档似乎表明您在调用 getID() 时实际上检索了一个新的 InstanceID,因此这使事情变得更加复杂。(供参考,我指的是:https://developers.google。)

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

这些 ID 和令牌什么时候到期?它们会过期吗?我将令牌作为字符串存储在服务器上,但如果其中任何一个过期,我怎么知道它们已经过期?我总是可以生成一个新的 InstanceID 和 Token,这看起来很容易,但是旧的是否保持活动状态?如何从服务器上擦除旧令牌?似乎有一种简单的方法可以在 iOS 端使用 APNS 执行此操作,您可以在其中检索所有过期令牌的列表,然后将它们从数据库中擦除。

4

3 回答 3

26

当我更新我的 GCM 实现时,我发现自己问了大部分这些问题。在搞砸了几天之后,这是我对您的问题的看法。

据我了解(如果我错了,请纠正我),我的服务器有一个 API 密钥和一个发件人 ID。使用发件人 ID,我可以让我的客户通过本地存储在我的客户端上的 InstanceID 请求令牌。

这是对的。

InstanceID 是在我的应用上线时分配的?

看起来它是在您的应用程序启动后立即分配的,即使设备无法访问 Internet。

它会改变吗?当应用程序升级或卸载并重新安装(或设备恢复)时怎么办?通过调用 InstanceID.getInstance,我将始终检索相同的 InstanceID,还是它最终会过期并给我一个新的?

根据InstanceID 文档

实例 ID 是稳定的,但可能会变为无效,如果:

  • 应用删除实例 ID
  • 设备已恢复出厂设置
  • 用户卸载应用
  • 用户清除应用数据

如果 Instance ID 失效,应用可以调用 getId() 请求新的 Instance ID。

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

通过调用 getID() 存储您检索的字符串是否有任何价值?

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

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

据我所知,在以前的实现中没有任何类型的 InstanceId,而且它看起来也没有在这个实现中明确使用。如果是,则在GcmReceiverGcmListenerService中调用它。

这些 ID 和令牌什么时候到期?它们会过期吗?

我已经解决了 ID 的过期问题,我们可以在Android InstanceID 实施指南中找到有关 Tokens 过期的信息:

Instance ID 服务会定期(例如,每 6 个月)发起回调,请求您的应用刷新其令牌。它还可能在以下情况下启动回调:

  • 存在安全问题;例如,SSL 或平台问题。
  • 设备信息不再有效;例如,备份和恢复。
  • 否则会影响实例 ID 服务。

该指南说继承InstanceIDListenerService并覆盖onTokenRefresh()以处理这些场景。

我将令牌作为字符串存储在服务器上,但如果其中任何一个过期,我怎么知道它们已经过期?

在您的服务器上实施 GCM的指南说 GCM 服务器将向您的服务器响应一些有关您用于尝试发送推送通知的令牌的信息。

我总是可以生成一个新的 InstanceID 和 Token,这看起来很容易,但是旧的是否保持活动状态?

我的测试表明,是的,他们确实如此。

如何从服务器上擦除旧令牌?似乎有一种简单的方法可以在 iOS 端使用 APNS 来执行此操作,您可以在其中检索所有过期令牌的列表,然后将它们从数据库中擦除。

我仍在研究这个问题,如果我能解决问题,我会更新。

于 2015-11-11T02:25:31.273 回答
6

这是我为检测数据库中的无效令牌所做的操作。

dry run向用户/用户列表发送通知时,GCM 中有一个选项。当您在发送通知时设置空运行时,它不会提醒客户端或向他们显示通知,但会返回有关哪些令牌有效(200)和哪些无效的响应。

如果您使用试运行选项向 200 个用户发送通知,那么您将以相同的顺序收到 GCM 的响应。

于 2016-06-14T08:38:18.963 回答
3

什么是实例 ID?

实例 ID 为您的应用程序的每个实例提供一个唯一 ID。您可以为 Android 和 iOS 应用程序以及 Chrome 应用程序/扩展程序实现实例 ID。

除了提供用于身份验证的唯一 ID 之外,Instance ID 还可以生成安全令牌以用于其他服务。

主要特征

  • 生成安全令牌
  • 验证应用真实性
  • 确认应用设备处于活动状态
  • 识别和跟踪应用程序

实例 ID 生命周期

  1. 当您的应用上线时,Instance ID 服务会发出一个 InstanceID。InstanceID 由公钥/私钥对支持,私钥存储在本地设备上,公钥在 Instance ID 服务中注册。
  2. 您的应用可以在需要时使用 getID() 方法请求新的 InstanceID。如果您有一个支持您的应用程序的应用程序,则您的应用程序可以将其存储在您的服务器上。
  3. 您的应用可以根据需要使用 getToken() 方法从 Instance ID 服务请求令牌,并且与 InstanceID 一样,您的应用也可以将令牌存储在您自己的服务器上。颁发给您的应用的所有令牌都属于该应用的 InstanceID。
  4. 令牌是唯一且安全的,但您的应用程序或实例 ID 服务可能需要在出现安全问题或用户在设备恢复期间卸载并重新安装您的应用程序时刷新令牌。您的应用程序必须实现一个侦听器以响应来自 Instance ID 服务的令牌刷新请求。

Instance ID 什么时候失效?

  • 应用删除实例 ID
  • 设备已恢复出厂设置
  • 用户卸载应用
  • 用户清除应用数据

如果 Instance ID 失效,应用可以调用 getId() 请求新的 Instance ID。要证明实例 ID 的所有权并允许服务器访问与应用关联的数据或服务,请调用 getToken(String, String)。

何时刷新令牌?

Instance ID 服务会定期(例如,每 6 个月)发起回调,请求您的应用刷新其令牌。它还可能在以下情况下启动回调:

存在安全问题;例如,SSL 或平台问题。设备信息不再有效;例如,备份和恢复。否则会影响实例 ID 服务。

您需要了解的有关 Instance ID 的所有信息都可以在以下官方链接中找到:

于 2017-09-12T14:17:47.800 回答