我的应用正在使用Google的C2DM(推送通知)来通知用户有关朋友的新活动。安装应用程序后,我将设备注册到C2DM服务器并存储用户的电话号码。所以我知道用户正在使用我的应用程序,我可以向他/她发送推送通知。但是如果用户卸载我的应用程序会发生什么,有没有办法在我的应用程序中捕获它?或者唯一的方法是当我发送C2DM并且它无法访问时在我的服务器上捕获错误,然后将用户标记为非活动状态?
我很乐意在他们的朋友使用应用时以及他们不再使用时通知用户。
这种情况的最佳解决方案是什么?
答案 0 :(得分:47)
GCM文档解释了这种情况:
“从设备卸载后,应用程序可以自动取消注册。但是,此过程不会立即发生,因为Android不提供卸载回调。”
当GCM尝试发送下一个推送通知时,设备会告诉GCM已卸载接收应用程序。
至于通知朋友他们的朋友不再使用该应用程序,GCM会在发生此故障时向您的通知服务器发送NotRegistered
错误;它不会立竿见影,但你能用它吗?
答案 1 :(得分:22)
不幸的是,ACTION_PACKAGE_REMOVED意图将发送给除您自己以外的所有接收者。这已得到确认here。
您的C2DM计划有些问题,因为我对它并不熟悉。如果用户长时间关闭设备,是否会触发您使用的错误情况? C2DM如何实际报告“无法访问”的设备?这是仅在尝试发送推送通知并且失败时发生的情况,还是在它以某种方式确定它到达设备但未能正确处理时?显然,在第二种情况下,你的计划会有效,但我可以看到其他一些“误报”。
较旧的SO问题供参考:android not receiving Intent ACTION_PACKAGE_REMOVED in the removed package
答案 2 :(得分:7)
Google C2DM服务在检测已卸载的应用程序时处于被动模式。
卸载应用程序后的第一次推送通知(无需从C2DM取消注册!!!)将不会返回任何错误响应。但是,第二个推送通知将返回“无效注册”或“未注册”错误代码,您可以在其中意识到已卸载该应用程序。
原因是C2DM服务器立即返回响应代码,然后才尝试推送客户端。当客户端响应卸载了某个应用程序时,它将从C2DM服务器中删除。下次尝试将立即返回错误代码。
答案 3 :(得分:7)
是的,但它非常hacky。 该方法基于以下事实:安卓卸载您的应用程序时所做的第一件事就是删除您的数据文件。因此,您可以使用文件观察程序来检测删除。 您还需要在本机代码中编写它。如果您在java中编写代码,您的应用程序将在执行任何代码之前被卸载。 请参阅此演示:https://github.com/sevenler/Uninstall_Statics
答案 4 :(得分:3)
我只知道服务器响应200的一种方式,主体中有“NotRegistered”消息。
NotRegistered - registration_id不再有效,例如用户已卸载应用程序或关闭通知。发件人应停止向此设备发送消息。
答案 5 :(得分:3)
我有一些要点告诉你,
当您从服务器向GCM发送消息时,您将收到响应字符串。如果您收到“NotRegistered”错误,则应从服务器数据库中删除注册ID,因为该应用程序是从设备卸载的,或者是没有配置接收com.google.android.c2dm.intent.RECEIVE意图的广播接收器。“
答案 6 :(得分:2)
查看此GCM文档: GCM Unregistration
您永远不应取消注册您的应用。服务器端需要注意这一点。