如何在卸载应用程序后从GCM取消注册

时间:2012-09-04 10:32:17

标签: android google-cloud-messaging

我已在我的应用程序中配置了GCM。我想在用户卸载应用程序时从GCM取消注册设备。

我的代码是

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

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

谢谢。

2 个答案:

答案 0 :(得分:21)

卸载时无法从GCM调用取消注册,因为在用户卸载应用程序时没有调用方法。

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

答案 1 :(得分:1)

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

请参阅:实施规范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

如果规范ID不为0,则表示您有重复注册。

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

registration_A

registration_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。

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

祝你好运!