我的应用使用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令牌吗?我真的想在应用程序首次启动时取消注册所有现有令牌,或者至少从手机设置中重置它们。
答案 0 :(得分:2)
您的应用的GCM令牌对于每个设备都是唯一的,因此如果您让其他用户告诉您他们使用与其他用户相同的GCM令牌,那么您就知道您所描述的情况已经发生。基本上,每次收到GCM令牌时,都应删除具有相同GCM令牌的所有旧记录,然后再将其分配给新用户。
答案 1 :(得分:1)
我相信当您的服务器向无效的注册ID发送邮件时,您会收到错误消息。我认为您可以捕获此错误以从数据库/数据存储中删除这些注册ID。
同样来自doc(canonical id):
如果稍后您尝试使用其他注册发送消息 ID,GCM将照常处理请求,但它将包括 规范注册ID在registration_id字段中 响应。确保替换存储在您的注册ID 具有此规范ID的服务器,因为最终您正在使用的ID 停止工作。