使所有gcm标记无效

时间:2012-12-05 13:38:19

标签: android google-cloud-messaging

我的应用使用gcm。每次用户登录时,都会注册新的gcm令牌并将其发送到我的第三方服务器。每次用户注销时,都会取消注册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令牌吗?我真的想在应用程序首次启动时取消注册所有现有令牌,或者至少从手机设置中重置它们。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

同样来自doc(canonical id):

  

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