【问题标题】:Is it possible to detect Android app uninstall?是否可以检测到 Android 应用程序卸载?
【发布时间】:2011-09-06 18:33:51
【问题描述】:

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

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

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

【问题讨论】:

标签: android uninstallation detect android-c2dm


【解决方案1】:

很遗憾,ACTION_PACKAGE_REMOVED 意图将被发送给除您自己之外的所有接收者。已确认here

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

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

【讨论】:

  • 应用程序NQ Mobile Security 在卸载时调用一个Activity 查看i.imgur.com/Fos9N.pngi.imgur.com/fIZbK.pngi.imgur.com/cG9Hr.png 和问题stackoverflow.com/questions/10219328/…
  • 好吧,最近有人在这件事上对我投了反对票。自从我 5 年前回答这个问题后,情况发生了变化吗?
  • @MattC:我已经修复了 Android 网站上的文档。也许是因为other answers 提供了一些解决方案?
  • 如果不可能,那么 Firebase Analytics 如何自动提供 app_remove 事件?
  • @OfekRon 我在 5 年前写了这个答案。它偶尔会出现在我和我自己的包裹中,但并非总是如此。也许现在它总是在您的应用被卸载之前交付。
【解决方案2】:

我只知道服务器响应 200 的一种方式,正文中包含“NotRegistered”消息。

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

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

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

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

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

      【讨论】:

        【解决方案5】:

        我有几点要告诉你,

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

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

        【讨论】:

          【解决方案6】:

          查看此 GCM 文档: GCM Unregistration

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

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              猜你喜欢
              • 2015-01-24
              • 2013-09-10
              • 2012-04-11
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多