卸载应用程序后如何从 GCM 注销

Posted

技术标签:

【中文标题】卸载应用程序后如何从 GCM 注销【英文标题】:How to unregister from GCM after uninstalling app 【发布时间】:2012-09-04 10:32:16 【问题描述】:

我已经在我的应用程序中配置了 GCM。每当用户卸载应用程序时,我都想从 GCM 注销设备。

我得到的代码是

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

但是我们必须把这段代码放在哪里..?

谢谢。

【问题讨论】:

更多信息来自:how to unregister from GCM 谢谢。这是一个很棒的信息 更多信息请参见这个 SO 答案:***.com/a/28057615/3913366。 【参考方案1】:

卸载时不能从 GCM 调用 unregister,因为在用户卸载应用程序时没有调用方法。

当您发送推送通知时,GCM 将检查用户是否拥有您的应用程序,如果用户已卸载该应用程序,GCM 会注意并通知您作为推送回复的一部分。

【讨论】:

真的吗?我正在使用 HTTP 将通知推送到 GCM,在我卸载应用程序后,GCM 仍然回复:“multicast_id”:XXXXXXXX,“success”:1,“failure”:0,“canonical_ids”:0,“results”: ["message_id":"0:XXXXXXXXX"] 我是否缺少要配置的内容? 在我的实验中,我发现卸载状态会在用户实际卸载应用程序后大约 8 天更新。时间可能会有所不同。【参考方案2】:

您必须在您的服务器上进行检查。您无法从应用程序代码中执行此操作,因为无法知道用户何时卸载应用程序。

请参阅:实施规范 ID。 参考:https://developers.google.com/cloud-messaging/http#request

规范注册 ID 定义为您的应用程序请求的最后一次注册的 ID。这是服务器在向设备发送消息时应使用的 ID。

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

参考:https://stuff.mit.edu/afs/sipb/project/android/docs/google/gcm/adv.html#canonical

如果 Canonical ID 不为 0,则您有重复注册。

例如,您的数据库中有 2 个注册:

注册_A

注册_B

当您发送推送通知时,您的服务器会得到如下响应:

"multicast_id":########,"success":1,"failure":0,"canonical_ids":1,"results":
["registration_id":"new_id_registration_id","message_id":"0:########"]
"multicast_id":######### ,"success":1,"failure":0,"canonical_ids":0,"results":["message_id":"0:################"]

将此数据存储在一个数组中。请注意,第一个具有“canonical_ids”:1。这意味着有重复。所以要知道数据库中的哪条记录是旧的。只需在上面搜索“registration_id”并保存索引值即可。此索引值指向数据库中的旧记录。

在上面的示例中,registration_A 将是旧的 registration_id。

从您的数据库中获取所有记录。然后根据您检索到的索引值将其删除。或者你可以更新它。这取决于您如何设置数据库。

祝你好运!

【讨论】:

以上是关于卸载应用程序后如何从 GCM 注销的主要内容,如果未能解决你的问题,请参考以下文章

卸载应用程序时注销RegId GCM

使所有 gcm 令牌无效

即使卸载后旧的 GCM 令牌仍然存在吗?

无需登录即可安装应用程序时的 GCM 和规范 ID

Android-GCM:如何照顾注销的用户?

GCM,注册 ID 和处理用户登录/注销