为什么我的设备使用Googles Cloud To Device Messaging Service获得多个活动令牌?

Jan*_*usz 7 android android-c2dm

我刚刚将C2DM功能添加到我的Android应用程序中.

如果在我的应用程序中启动C2DM,则会发生以下情况.

  1. 我的应用程序发送注册意图
  2. 答案广播由我的应用程序收到
  3. 从intent中检索设备令牌并将其发送到我的服务器

    从那一刻起,一切都很好.客户端收到推送通知等.如果以下情况发生,则会出现问题:

  4. 用户在不禁用推送的情况下卸载应用程序.(完全删除它不仅更新)

  5. 用户重新安装应用程序

如果在步骤5之后发送推送通知,我的应用仍会收到此通知.似乎从先前安装中检索到的令牌仍处于活动状态,并重新连接到我的应用程序的新实例.

这导致了以下问题:

  • 重新安装我的应用程序但无意接收推送通知的用户无法从服务中删除自己,因为该应用程序的新实例无法从我的服务器取消注册旧令牌.

这是C2DM系统中的错误还是我的设置有问题?

更新

我遵循了Berdons的建议并做了以下事情:

出于测试目的,每次我的应用程序启动时,只启动取消注册Intent.发送取消注册后,我的服务器的推送通知不会发送到我的应用程序.这似乎可以解决问题,但如果我现在进入C2DM设置屏幕并打开我的应用程序的推送通知,所有旧令牌再次激活,我会收到我在我的应用程序的当前安装中未注册的信息.

下一次更新

看来我不是唯一有这个问题的人:

Android C2DM:将消息复制到同一设备和应用程序

我希望谷歌能够管理这些令牌,使得同一设备的旧令牌在发布新令牌后被禁用.我还希望在我向该应用程序发送取消注册Intent所有令牌后,该设备被标记为无效或从Google服务器中永久删除.如果这是某种形式的谷歌设计决定的特殊用例我不明白请赐教.

Jan*_*usz 4

我们现在找到了一个适用于大多数情况的解决方案。

服务器将 C2DM 注册 ID 添加为每个 C2D 消息的数据字段。

  • 现在,只有当消息中的令牌与预置文件中存储的令牌匹配时,设备才会显示通知。这样我们就可以保证不会显示有关先前安装所获取的设备令牌的消息。
  • 如果令牌不匹配,我们会发现一个不应再处于活动状态的旧令牌。现在,我们将自己的 Web 服务器上的令牌标记为非活动状态,以防止服务器发送更多不必要的 C2D 消息

该解决方案使我们能够仅显示相关数据,而无需存储唯一的用户 ID。