2011-06-02 123 views
48

我的應用程序使用Google的C2DM(推送通知)通知用戶有關朋友的新活動。一旦他們安裝了應用程序,我就用C2DM服務器註冊設備並存儲用戶的電話號碼。所以我知道用戶正在使用我的應用程序,我可以向他/她發送推送通知。但是,如果用戶卸載我的應用程序會發生什麼,有沒有辦法在我的應用程序中捕捉它?或者唯一的方法是當我發送C2DM並且無法訪問時在我的服務器上發現錯誤,然後將用戶標記爲不活動?是否有可能檢測到Android應用程序的卸載?

我很想在用戶朋友使用應用程序時以及不再使用時通知用戶。

什麼是這種情況下的最佳解決方案?

+1

下面的應用程序(以某種方式)只要卸載它,即會在默認瀏覽器中打開一個新選項卡:https://play.google.com/store/apps/details?id = com.UCMobile.intl – caw 2015-02-01 23:00:47

+2

對於新的應用程序開發人員:請不要存儲用戶的電話號碼。 [改用廣告ID](http://android-developers.blogspot.com/2013/10/google-play-services-40.html)。 – 2016-01-21 00:11:52

+1

@DanDascalescu你有興趣看看這裏http://chat.stackoverflow.com/rooms/99906/android-canonicals?我可以做好反饋。 – 2016-01-21 02:53:30

回答

15

不幸的是ACTION_PACKAGE_REMOVED意圖將被髮送到除您自己以外的所有接收者。這已確認here

您的C2DM計劃的一些問題,因爲我不是很熟悉它。如果用戶長時間關閉設備,是否會觸發您使用的錯誤條件? C2DM如何報告「無法訪問」的設備?這是一種只發生在嘗試發送推送通知並失敗時的情況,或者是在它以某種方式確定它到達設備但未能正確處理時發生的情況?很明顯,在第二種情況下,您的計劃可能會奏效,但我可以看到一些「誤報」。

參考較早的SO問題:android not receiving Intent ACTION_PACKAGE_REMOVED in the removed package

+2

應用程序'NQ Mobile Security'在卸載時調用一個活動,查看http://i.imgur.com/Fos9N.png,http://i.imgur.com/fIZbK.png,http ://i.imgur.com/cG9Hr.png和問題http://stackoverflow.com/questions/10219328/how-to-show-an-activity-before-my-app-is-uninstalled-android – 2012-06-16 09:50:07

+0

好的,最近有人在這方面低估了我。自從我5年前回答這個問題後它有所改變嗎? – MattC 2016-02-01 17:49:18

+1

@MATC:我已經修復了Android網站上的文檔。也許downvote是由於[其他答案](http://stackoverflow.com/questions/18692571/how-can-an-app-detect-that-its-going-to-be-uninstalled)提供一些解決方案? – 2016-02-04 18:23:26

3

我知道用身體「NotRegistered」消息服務器響應200只有一個辦法。

NotRegistered - registration_id不再有效,例如用戶卸載了應用程序或關閉了通知。發件人應該停止向該設備發送消息。

7

當涉及到檢測到卸載的應用程序時,Google C2DM服務正處於被動模式。

卸載您的應用程序(無需從C2DM註銷!!!)的第一次推送通知將不會返回任何錯誤的迴應。但是,第二次推送通知將返回一個「無效註冊」或「未註冊」的錯誤代碼,您可以在其中意識到應用程序已被卸載。

原因是C2DM服務器立即返回響應代碼,然後才嘗試推送客戶端。當客戶端迴應卸載應用程序時,它將從C2DM服務器中刪除。下一次嘗試嘗試將立即返回錯誤代碼。

44

的GCM文檔解釋這種情況在這裏:

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

「它是從設備卸載後的應用程序可以自動取消註冊。然而,這個過程不會發生向右走,因爲Android不提供卸載回調。「

基本上,當GCM嘗試發送下一個推送通知時,設備將告訴GCM接收的應用程序已被卸載。

至於通知朋友他們的朋友不再使用該應用程序,GCM將在發生此故障時向您的通知服務器發送NotRegistered錯誤;它不會立即,但你可以使用它?

3

我有幾點要告訴你,

  1. Android社區建議您使用GCM取代C2DM,因爲它是不再可用。
  2. 在android中,應用程序無法通知應用程序正在卸載。
  3. 在GCM如果你想停止發送消息,以卸載的應用可以參考這個

當你從你的服務器,你會得到響應string.In,如果你正在爲錯誤消息發送到GCM 「NotRegistered,您應該從服務器數據庫中刪除註冊ID,因爲應用程序是從設備上卸載的,或者它沒有配置接收com.google.android.c2dm.intent.RECEIVE意圖的廣播接收器。」

2

看看這個GCM DOC: GCM Unregistration

你永遠不應該註銷您的應用程序。這從服務器端來看很重要。

7

是的,但它很hacky。 該方法基於這樣的事實:android在卸載應用程序時執行的第一件事是刪除您的數據文件。所以你可以使用文件觀察器來檢測刪除。 你也需要用本機代碼編寫它。如果你用java編寫你的代碼,你的應用程序將在它執行任何代碼之前被卸載。 請參閱此演示:https://github.com/sevenler/Uninstall_Statics

相關問題