65

我的应用程序正在使用 Google 的 C2DM(推送通知)来通知用户来自朋友的新活动。一旦他们安装了应用程序,我就会在 C2DM 服务器上注册设备并存储用户的电话号码。所以我知道用户正在使用我的应用程序,我可以向他/她发送推送通知。但是如果用户卸载我的应用程序会发生什么,有没有办法在我的应用程序中捕获它?或者唯一的方法是在我发送 C2DM 并且无法访问时在我的服务器上捕获错误,然后将用户标记为非活动?

我很乐意在他们的朋友使用应用程序以及不再使用应用程序时通知用户。

这种情况的最佳解决方案是什么?

4

7 回答 7

50

GCM 文档在这里解释了这种情况:

https://developers.google.com/cloud-messaging/registration#how-uninstalled-client-app-unregistration-works

“应用程序在从设备上卸载后可以自动取消注册。但是,这个过程不会立即发生,因为 Android 不提供卸载回调。”

基本上当 GCM 尝试发送下一个推送通知时,设备会告诉 GCM 接收应用程序已卸载。

至于通知朋友他们的朋友不再使用该应用程序,NotRegistered当发生此故障时,GCM 会向您的通知服务器发送错误消息;它不会立即生效,但你可以使用它吗?

于 2012-12-03T14:56:40.890 回答
26

不幸的是 ACTION_PACKAGE_REMOVED 意图将被发送给除您自己之外的所有接收者。这一点在这里得到证实。

关于您的 C2DM 计划的一些问题,因为我对它不是很熟悉。如果用户只是长时间关闭他们的设备,这会触发您使用的错误条件吗?C2DM 如何实际报告“无法访问”的设备?这是仅在尝试发送推送通知但失败时发生的情况,还是在以某种方式确定它到达设备但未能正确处理时发生的情况?显然,在第二种情况下,您的计划会奏效,但我可以看到一些“误报”发生在其他情况下。

较旧的 SO 问题供参考:android not received Intent ACTION_PACKAGE_REMOVED in the removed package

于 2011-06-02T02:23:56.207 回答
8

是的,但它非常hacky。该方法基于这样一个事实,即 android 在卸载您的应用程序时所做的第一件事就是删除您的数据文件。因此,您可以使用文件观察程序来检测删除。您还需要用本机代码编写它。如果您用 Java 编写代码,您的应用程序将在执行任何代码之前被卸载。请看这个演示:https ://github.com/sevenler/Uninstall_Statics

于 2015-07-02T02:54:22.517 回答
7

在检测已卸载的应用程序时,Google C2DM 服务以被动模式工作。

卸载您的应用程序后的第一次推送通知(无需从 C2DM 注销!!!)将不会返回任何错误作为响应。但是,第二次推送通知将返回“无效注册”或“未注册”错误代码,您可以在其中意识到应用程序已被卸载。

原因是 C2DM 服务器立即返回响应代码,然后才尝试推送客户端。当客户端响应应用程序已卸载时,它会从 C2DM 服务器中删除。下一次推送尝试将立即返回错误代码。

于 2012-03-01T16:05:46.227 回答
5

我有几点要告诉你,

  1. Android 社​​区建议您使用 GCM 而不是 C2DM,因为它不再可用。
  2. 在 android 中,应用程序无法通知自己应用程序正在被卸载。
  3. 在 GCM 中,如果您想停止向已卸载的应用程序发送消息,您可以参考这个

当您从服务器向 GCM 发送消息时,您将收到响应字符串。如果您收到“未注册”错误,您应该从服务器数据库中删除注册 ID,因为该应用程序已从设备上卸载,或者它没有广播接收器配置为接收 com.google.android.c2dm.intent.RECEIVE 意图。”

于 2013-01-18T06:46:39.017 回答
3

我只知道服务器响应 200 中带有“NotRegistered”消息的一种方式。

NotRegistered — registration_id 不再有效,例如用户已卸载应用程序或关闭通知。发件人应停止向此设备发送消息。

于 2011-06-04T09:31:46.680 回答
2

查看此 GCM 文档: GCM 注销

您永远不应该取消注册您的应用程序。这是从服务器端处理的。

于 2013-08-26T11:49:43.223 回答