5

我的应用程序使用 gcm。每次用户登录时,都会注册新的 gcm 令牌并将其发送到我的第 3 方服务器。每次用户注销时,都会注销 gcm 令牌。这炒锅没有任何问题。

问题是在测试时,测试人员可以在不注销的情况下卸载应用程序,然后重新安装并登录另一个帐户。然后他会从两个不同的帐户收到两个 gcms。这意味着他将收到他当前未登录的帐户的私人 gcms。有时,实时用户甚至会发生这种情况。

GCM 文档指出,如果卸载应用程序,gcm 令牌有时会过期。在实践中,这永远不会发生。
http://developer.android.com/google/gcm/gcm.html

GCM 文档还指出,您可以通过执行取消注册 GCM 令牌

Intent unregIntent = new Intent("com.google.android.c2dm.intent.UNREGISTER");
unregIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0));
startService(unregIntent);

但是,如果您在重新安装后尝试此方法似乎不起作用。我确实收到了回调,它告诉我令牌未注册,但 gcm 令牌仍然可以正常工作。

我的问题是:您能否确保您的应用程序没有有效的 gcm 令牌?我真的很想在应用程序首次启动期间取消注册所有现有令牌,或者至少从手机设置中重置它们。

4

2 回答 2

2

您的应用程序的 GCM 令牌对于每台设备都是唯一的,因此,如果您有不同的用户告诉您他们使用与其他用户相同的 GCM 令牌,那么您就知道您描述的情况已经发生。基本上,每次收到 GCM 令牌时,您都应该删除所有具有相同 GCM 令牌的旧记录,然后再将其仅分配给新用户。

于 2013-01-31T00:14:25.233 回答
1

我相信当您的服务器向无效的注册 ID 发送消息时,您会收到错误消息。我认为您可以捕获此错误以从数据库/数据存储中删除这些注册 ID。

同样来自文档(规范 id):

如果稍后您尝试使用不同的注册 ID 发送消息,GCM 将照常处理请求,但它将在响应的 registration_id 字段中包含规范注册 ID。确保使用此规范 ID 替换存储在您服务器中的注册 ID,因为最终您使用的 ID 将停止工作。

于 2012-12-05T13:45:08.633 回答