卸载应用后如何从GCM(Google Cloud Messaging)取消注册

13

我已经在我的应用程序中配置了GCM。我希望在用户卸载应用程序时从GCM注销设备。

我获得的代码如下:

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

但是我们应该把这段代码放在哪里呢..?

谢谢。


1
从这里获取更多信息:如何从GCM注销 - Naresh J
谢谢。这是一份很棒的信息。 - Sakthimuthiah
更多信息请参见此SO答案: https://dev59.com/pF4c5IYBdhLWcg3wUI4N#28057615。 - Shubham A.
2个回答

21

当用户卸载应用程序时,无法调用 GCM 中的 unregister 方法,因为没有方法在用户卸载应用程序时被调用。

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


2
真的吗?我正在使用HTTP将通知推送到GCM,但在卸载应用程序后,GCM仍然回复了以下内容:{"multicast_id":XXXXXXXX,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:XXXXXXXXX"}]}。我是否遗漏了某些配置? - danisupr4
1
在我的实验中,我发现卸载状态在用户实际卸载应用后大约8天后更新。这个时间可能有所变化。 - Yashwanth Kumar

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

注册_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。

从你的数据库中获取所有记录。然后根据检索到的索引值进行删除或更新。这取决于你如何设置数据库。

祝好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接