Android 使所有gcm令牌无效

Android 使所有gcm令牌无效,android,google-cloud-messaging,Android,Google Cloud Messaging,我的应用程序使用gcm。每次用户登录时,都会注册新的gcm令牌并将其发送到我的第三方服务器。每次用户注销时,都会注销gcm令牌。这锅没有任何问题 问题是,当涉及到测试时,测试人员可以在不注销的情况下卸载应用程序,然后重新安装并登录到另一个帐户。然后他将从两个不同的帐户收到两个GCM。这意味着他将收到他当前未登录的帐户的私人GCM。这甚至可能发生在实时用户身上 GCM文档指出,如果卸载应用程序,GCM令牌有时可能会过期。实际上,这种情况从未发生过。 GCM文档还指出,您可以通过执行 Intent

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

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

GCM文档指出,如果卸载应用程序,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令牌?我真的希望在应用程序首次启动期间注销所有现有令牌,或者至少从电话设置中重置它们

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

同样从doc()中:

如果以后您尝试使用其他注册发送消息 ID,GCM将一如既往地处理请求,但它将包括 的注册ID字段中的规范注册ID 答复。请确保替换存储在计算机中的注册ID 具有此规范ID的服务器,最终您使用的ID将 停止工作


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

我是GCM新手,因此我不确定是否感谢您,我将尝试此方法。但仍然有一个问题——我必须发送这个gcm消息,以了解旧令牌已被替换。这意味着用户仍将接收来自先前登录用户的私人消息,至少一次。我可能可以将userId添加到每个gcm数据包中,并在客户端进行检查,但我仍然希望有更好的方法来实现我的需求。嘿,亚历克赛,你选择了什么解决方案?我按照穆罕默德·哈菲兹的建议做了。我有一个包含用户ID和gcm令牌的表。这两个字段都是唯一的。当我收到带有新gcm令牌的现有用户ID时,我更新gcm令牌。当我收到带有新用户id的现有gcm令牌时,我会更新用户id。这似乎涵盖了所有可能的情况。如果一个用户在两个设备中登录,会发生什么情况。我担心这两台设备无法使用此解决方案接收gcm消息。或者我遗漏了什么。是的,只有最后一台设备才会接收gcm消息。我相信您实际上只能使gcm令牌唯一并允许用户ID重复,但该语句需要进一步测试。这取决于是否有任何设备在重新安装后总是返回相同的gcm令牌(这似乎是真的,但文档中没有提到)。