服务器和客户端为同一设备和应用程序获取不同的GCM注册ID

时间:2014-08-21 02:17:35

标签: push-notification google-api google-cloud-messaging

我正在跟踪GCM令牌更新的潜在竞争状况,并想询问是否有人知道在这种情况下会发生什么。

假设我有一个名为pushDelivery的服务器,它通过GCM和一个名为X的Android客户端发送推送.X告诉pushDelivery每次用户前移应用程序时它的推送令牌是什么。

  1. X启动,从Google服务器检索它的令牌“A”,然后告诉pushDelivery存储它的令牌
  2. pushDelivery存储令牌A
  3. pushDelivery向X发送消息,并从Google服务器接收更新的GCM令牌(规范注册ID)“B”。 pushDelivery用B替换A
  4. X启动,从Google服务器检索它的令牌
  5. 问题是:在步骤3中,X是否从Google服务器接收令牌A或B? 我担心的是,如果X收到令牌A,那么pushDelivery将最终用A覆盖B.下次pushDelivery向X发送推送时,它将用B覆盖A

1 个答案:

答案 0 :(得分:0)

首先,每次进入前台时,“X”应用程序都不应注册到GCM。它应该只在首次启动时注册一次,或者在安装udpate后首次启动时注册。

对于您的“第3步”,如果GCM服务器返回规范的注册ID,则仅表示您的应用未能向您的服务器提供从Google获得的最新注册ID,或者您的服务器未能保留最新的注册ID或删除同一设备的先前注册ID。 GCM不会自行更改规范注册ID。它只能由于客户端应用程序调用的GCM注册而更改(即使在这种情况下注册ID通常保持不变,除非您注销并再次注册)。

因此,为了回答您的问题,在您的服务器从Google获得规范的注册ID B后,在客户端应用程序上完成的任何GCM注册都应该生成相同的注册ID B(除非由于某种原因创建了更新的注册ID )。 GCM不会将旧的注册ID A返回到您的客户端应用程序。