使所有 gcm 令牌无效

Posted

技术标签:

【中文标题】使所有 gcm 令牌无效【英文标题】:Invalidate all gcm tokens 【发布时间】:2012-12-05 13:38:19 【问题描述】:

我的应用使用 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 令牌?我真的很想在应用程序首次启动期间取消注册所有现有令牌,或者至少从手机设置中重置它们。

【问题讨论】:

嗨,Alexey,你用了什么解决方案 我按照 Mohamed Hafez 的建议做了。我有一张带有用户 ID 和 gcm 令牌的表。这两个字段都是独一无二的。当我收到带有新 gcm 令牌的现有 userId 时,我会更新 gcm 令牌。当我收到具有新用户 ID 的现有 gcm 令牌时,我会更新用户 ID。这似乎涵盖了所有可能的极端情况。 如果用户在两台设备上登录会发生什么。我担心这两个设备不会使用此解决方案接收 gcm 消息。还是我错过了什么。 是的,只有最后一个设备会收到 gcm 消息。我相信您实际上只能使 gcm 令牌唯一并允许用户 ID 重复,但该声明需要进一步测试。这取决于任何设备在重新安装后是否总是返回相同的 gcm 令牌(这似乎是真的,但文档中没有提到)。 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

也来自文档 (canonical id):

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

【讨论】:

我是 GCM 新手,所以我不确定 rthis 谢谢,我试试这个。但是仍然存在一个问题 - 我必须发送这条 gcm 消息才能了解旧令牌已被替换。这意味着用户仍然会收到以前登录用户的私人消息,至少一次。我可能可以将 userId 添加到每个 gcm 数据包并在客户端检查它,但我仍然希望有更好的方法来完成我所需要的。

以上是关于使所有 gcm 令牌无效的主要内容,如果未能解决你的问题,请参考以下文章

InstanceID API 返回的 GCM 令牌给出 NotRegistered 错误

无法在缓存错误 GCM iOS 中找到令牌

使以前的令牌无效并检查用户是不是有 JWT 令牌

AzureAD JWT 令牌受众声明前缀使 JWT 令牌无效

APNS 或 GCM 设备令牌验证

GCM 多设备令牌