我刚为我的Android应用程序添加了C2DM功能。
目前,如果在我的应用程序中启动C2DM,将发生以下情况:
1. 我的应用程序发送注册Intent 2. 我的应用程序接收到答案广播 3. 从Intent中检索设备令牌并将其发送到我的服务器 从那时起,一切都正常运作。客户端可以接收推送通知等。 如果发生以下情况,就会出现问题: 4. 用户删除应用程序而不禁用推送(完全删除它而不仅仅是更新) 5. 用户重新安装应用程序
如果在第5步之后发送推送通知,我的应用程序仍然会接收此通知。 似乎从先前安装中检索的令牌仍然处于活动状态,并重新连接到应用程序的新实例。
这导致了以下问题:
用户重新安装我的应用程序但不打算接收推送通知,则无法从服务中删除自己,因为应用程序的新实例无法取消注册旧令牌。
这是C2DM系统中的一个错误还是我的设置有问题?
目前,如果在我的应用程序中启动C2DM,将发生以下情况:
1. 我的应用程序发送注册Intent 2. 我的应用程序接收到答案广播 3. 从Intent中检索设备令牌并将其发送到我的服务器 从那时起,一切都正常运作。客户端可以接收推送通知等。 如果发生以下情况,就会出现问题: 4. 用户删除应用程序而不禁用推送(完全删除它而不仅仅是更新) 5. 用户重新安装应用程序
如果在第5步之后发送推送通知,我的应用程序仍然会接收此通知。 似乎从先前安装中检索的令牌仍然处于活动状态,并重新连接到应用程序的新实例。
这导致了以下问题:
用户重新安装我的应用程序但不打算接收推送通知,则无法从服务中删除自己,因为应用程序的新实例无法取消注册旧令牌。
这是C2DM系统中的一个错误还是我的设置有问题?
我按照Berdon的建议做了以下事情:
仅用于测试目的,每次启动我的应用程序时启动未注册的意图。发送未注册的意图后,我的服务器不会向我的应用程序发送任何推送通知。这似乎起到了作用,但是如果我现在进入C2DM设置屏幕并为我的应用程序打开推送通知,则所有旧令牌都会重新激活,并且我会收到当前安装的应用程序中没有注册的信息。
下一个更新
看来我不是唯一遇到这个问题的人:
我希望Google以某种方式管理那些令牌,使得在发放新令牌后,来自同一设备的旧令牌被禁用。我还期望,在发送未注册的意图后,该应用程序和该设备的所有令牌都被标记为无效或从Google服务器永久删除。如果这是Google针对特殊用例的设计决策,我不明白,请给我指点。