我正在追踪GCM令牌更新的潜在竞争条件,并想问是否有人知道在这种情况下会发生什么。
假设我有一个名为pushDelivery的服务器,它通过GCM和一个名为X的Android客户端发送推送,X告诉pushDelivery它的推送令牌是什么,每次用户前台应用程序。
- X启动,检索它的令牌,"A",从谷歌服务器,然后告诉pushDelivery存储它的令牌
- pushDelivery存储令牌A
- pushDelivery向X发送消息,并从Google服务器接收更新的GCM令牌(规范注册ID)"B"。pushDelivery用B替换A
- X启动,从Google服务器检索它的令牌
首先,"X"应用程序不应该在每次进入前景时都注册到GCM。它应该只在第一次启动时注册一次,或者在安装更新后第一次启动时注册一次。
至于你的"步骤3",如果GCM服务器返回一个规范的注册ID,这只意味着你的应用程序未能给你的服务器从谷歌得到的最新注册ID,或者你的服务器未能坚持最新的注册ID或删除同一设备的以前的注册ID。GCM本身不会更改规范注册ID。它只能由于客户端应用程序调用的GCM注册而更改(即使在这种情况下,注册ID通常保持不变,除非您取消注册并再次注册)。
因此,为了回答你的问题,在你的服务器从谷歌获得一个规范的注册ID B之后,在客户端应用程序上完成的任何注册到GCM都应该产生相同的注册ID B(除非,由于某种原因创建了一个新的注册ID)。GCM将不会将旧的注册ID A返回给您的客户端应用程序。