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

时间:2015-06-25 21:46:32

标签: android token google-cloud-messaging instanceid

由于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来执行此操作,您可以在其中检索所有过期令牌的列表,然后从数据库中擦除它们。

3 个答案:

答案 0 :(得分:24)

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

  

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

这是正确的。

  

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

即使设备无法访问互联网,也会在应用启动后立即分配。

  

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

根据InstanceID documentation

  

实例ID是稳定的,但如果出现以下情况可能会失效:

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

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

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

  

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

看起来API会把这个存储在你应用程序的本地存储中。

  

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

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

  

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

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

  

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

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

指南说要继承InstanceIDListenerService并覆盖onTokenRefresh()来处理这些情况。

  

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

guide for implementing GCM on your server表示GCM服务器将使用您尝试发送推送通知的令牌的某些信息来响应您的服务器。

  

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

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

  

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

我还在调查这个问题,如果我能搞清楚,我会更新。

答案 1 :(得分:6)

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

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

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

答案 2 :(得分:2)

什么是实例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. 令牌是唯一且安全的,但是在安全问题或用户在设备恢复期间卸载并重新安装应用时,您的应用或Instance ID服务可能需要刷新令牌。您的应用必须实现一个侦听器来响应来自Instance ID服务的令牌刷新请求。
  5. 实例ID何时失效?

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

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

    何时刷新令牌?

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

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

    您可以在以下官方链接中找到有关实例ID的所有信息: