什么时候GCM令牌过期,什么是InstanceID?

B. *_*oth 25 android token instanceid google-cloud-messaging

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

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

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

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

pum*_*e65 24

我发现自己在更新GCM实施时自己提出了大部分问题.几天后搞砸了,这是我对你的问题的看法.

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

这是对的.

我的应用程序上线时会分配InstanceID吗?

即使设备无法访问Internet,它也会在您的应用启动后立即分配.

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

根据InstanceID文档:

实例ID是稳定的,但如果符合以下条件,则可能无效:

  • 应用程序删除实例ID
  • 设备出厂重置
  • 用户卸载该应用程序
  • 用户清除应用数据

如果实例ID变为无效,则应用程序可以调用getId()来请求新的实例ID.

我已经测试了卸载应用程序并清除数据,结果表明上述所有情况都属实.

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

它看起来像API处理将此存储在您应用程序的本地存储中.

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

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

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

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

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

  • 存在安全问题; 例如,SSL或平台问题.
  • 设备信息不再有效; 例如,备份和还原.
  • 实例ID服务受到其他影响.

该指南表示要将InstanceIDListenerService子类化并覆盖onTokenRefresh()以处理这些方案.

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

在服务器上实施GCM指南说明GCM服务器将使用您尝试发送推送通知的令牌的一些信息来响应您的服务器.

我总是可以生成一个新的InstanceID和Token,这看起来很简单,但旧的那些仍然保持活跃状态​​?

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

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

我仍然在研究这个问题,如果能搞清楚,我会更新.

  • 根据本指南(https://developers.google.com/cloud-messaging/registration),可以使用“ÌnstanceID.deleteToken()”和“ InstanceID”清除GCM服务器中的旧令牌和ID .deleteInstanceID```。 (2认同)

Ers*_*soy 6

@ pumpkinpie65和@B.这里的Roth是我在数据库中检测无效令牌所做的.

在向用户/用户列表发送通知时,GCM中存在"干运行"选项.在发送通知时设置干运行时,它不会向客户端发出警报或向其显示通知,而是返回有关哪些令牌有效(200)以及哪些令牌无效的响应.

如果您使用dry-run选项向200个用户发送通知,那么您将以相同的顺序从GCM获得响应.