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);

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

谢谢你。

4

2 回答 2

21

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

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

于 2012-09-04T10:36:26.403 回答
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

如果 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。

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

祝你好运!

于 2015-07-10T05:20:59.177 回答