Можно ли обнаружить удаление приложения для Android? - PullRequest
55 голосов
/ 02 июня 2011

Мое приложение использует Google C2DM (push-уведомление) для уведомления пользователей о новых действиях от друзей. После установки приложения я регистрирую устройство на серверах C2DM и сохраняю номер телефона пользователя. Итак, я знаю, что пользователь использует мое приложение, и я могу отправить ему / ей push-уведомления. Но что произойдет, если пользователи удалят мое приложение, есть ли способ поймать его в моем приложении? Или единственный способ - поймать ошибку на моем сервере, когда я отправляю C2DM, и он недоступен, и пометить пользователя как неактивного?

Я бы хотел уведомить пользователей, когда их друзья используют приложение, а когда они больше не работают.

Каково лучшее решение для этого сценария?

Ответы [ 7 ]

47 голосов
/ 03 декабря 2012

Документация GCM объясняет эту ситуацию здесь:

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

"Приложение можно автоматически отменить регистрацию после удаления с устройства. Однако этот процесс не происходит сразу, поскольку Android не обеспечивает обратный вызов удаления. "

Обычно, когда GCM пытается отправить следующее push-уведомление, устройство сообщит GCM, что получающее приложение было удалено.

Что касается уведомления друзей о том, чтоих друзья больше не используют приложение, GCM отправит ошибку NotRegistered на ваш сервер уведомлений при возникновении этой ошибки;это не будет немедленным, но не могли бы вы это использовать?

22 голосов
/ 02 июня 2011

К сожалению, намерение ACTION_PACKAGE_REMOVED будет отправлено всем получателям, кроме вашего. Это подтверждается здесь .

Некоторые вопросы для вашего плана C2DM, так как я не очень знаком с ним. Если пользователь просто оставит свое устройство на долгое время, это вызовет состояние ошибки, которое вы используете? Как C2DM на самом деле сообщает о «недоступном» устройстве? Это условие, которое возникает только тогда, когда он пытается отправить push-уведомление и терпит неудачу, или это когда он каким-то образом определяет, что он достигает устройства, но не обрабатывается должным образом? Очевидно, что во втором сценарии ваш план сработает, но я вижу некоторые «ложные срабатывания», происходящие в противном случае.

Более старый вопрос SO для справки: Android не получает Intent ACTION_PACKAGE_REMOVED в удаленном пакете

7 голосов
/ 02 июля 2015

Да, но это довольно забавно. Этот метод основан на том факте, что первое, что делает Android при удалении вашего приложения, - это удаление файла данных. Таким образом, вы можете использовать средство отслеживания файлов для обнаружения удаления. Также вам нужно написать это в родном коде. Если вы напишите свой код на Java, ваше приложение будет удалено до того, как оно сможет выполнить какой-либо код. пожалуйста, посмотрите это демо: https://github.com/sevenler/Uninstall_Statics

7 голосов
/ 01 марта 2012

Служба Google C2DM работает в пассивном режиме, когда дело доходит до обнаружения удаленных приложений.

Первое push-уведомление после удаления приложения (без отмены регистрации в C2DM !!!) НЕ возвращает ошибку в ответ.Однако второе push-уведомление возвратит «неверную регистрацию» или «незарегистрированные» коды ошибок, из-за которых вы можете понять, что приложение было удалено.

Причина в том, что серверы C2DM возвращают код ответа немедленно и только после этого пытаютсяподтолкнуть клиента.Когда клиент отвечает, что приложение было удалено, оно удаляется с серверов C2DM.Следующая попытка нажатия немедленно вернет код ошибки.

3 голосов
/ 18 января 2013

У меня есть кое-что сказать,

  1. Сообщество Android рекомендует вам использовать GCM вместо C2DM, поскольку оно больше не доступно.
  2. В андроиде приложения не могут получать уведомления о том, что приложение удаляется.
  3. в GCM, если вы хотите прекратить отправку сообщений в удаленные приложения, вы можете сослаться на это

Когда вы отправляете сообщения в GCM со своего сервера, вы получите строку ответа. При этом, если вы получаете сообщение об ошибке «NotRegistered», вам следует удалить регистрационный идентификатор из базы данных вашего сервера, поскольку приложение было удалено с устройства или оно выполняет не настроен приемник вещания для приема намерений com.google.android.c2dm.intent.RECEIVE. "

3 голосов
/ 04 июня 2011

Я знаю только один способ с ответом сервера 200 с сообщением «NotRegistered» в теле.

NotRegistered - регистрационный идентификатор больше недействителен, например, пользователь удалил приложение или отключил уведомления. Отправитель должен прекратить отправку сообщений на это устройство.

2 голосов
/ 26 августа 2013

Просмотрите этот документ GCM: Отмена регистрации GCM

Вы никогда не должны отменять регистрацию своего приложения.Об этом заботятся со стороны сервера.

...