2012-09-04 45 views
13

我在我的應用程序中配置了GCM。我想從GCM取消註冊設備,只要用戶將卸載應用程序。如何從卸載應用程序後從GCM註銷

我得到的代碼

Intent unregIntent = new Intent("com.google.android.c2dm.intent.UNREGISTER"); 
unregIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0)); 
startService(unregIntent); 

,但我們必須把這個代碼..?

謝謝。

+1

瞭解了更多信息:[如何從GCM註銷](http://developer.android。com/guide/google/gcm/adv.html#unreg) –

+0

謝謝。它是一個了不起的信息 – Sakthimuthiah

+0

更多信息在此SO回答:http://stackoverflow.com/a/28057615/3913366。 –

回答

21

由於在用戶卸載應用程序時沒有方法調用,因此您不能在卸載時從GCM調用註銷。

當您發送推送通知時,GCM將檢查用戶是否擁有您的應用程序,如果用戶卸載了應用程序,GCM將會注意相同並通知您作爲推送回復的一部分。

+2

真的嗎? GCM仍然回覆:{「multicast_id」:XXXXXXXX,「success」:1,「failure」:0,「canonical_ids」:0,「results」:我使用HTTP將notif推送到GCM, [{「message_id」:「0:XXXXXXXXX」}]} 我是否缺少配置? – danisupr4

+1

在我的實驗中,我發現卸載狀態在用戶實際卸載應用程序後的8天左右纔會更新。時間可能會有所不同。 –

1

你必須檢查你的服務器上。您無法從應用程序代碼執行此操作,因爲無法知道用戶何時卸載應用程序。

請參閱:實施規範ID。 參考:https://developers.google.com/cloud-messaging/http#request

規範註冊ID被定義爲您的應用程序請求的最後一次註冊的ID。這是服務器在向設備發送消息時應使用的ID。

如果稍後嘗試使用不同的註冊ID發送消息,GCM將像往常一樣處理請求,但它將在響應的registration_id字段中包含規範註冊ID。請確保使用此規範ID替換存儲在您的服務器中的註冊ID,因爲您最終使用的ID將停止工作。

參考:https://stuff.mit.edu/afs/sipb/project/android/docs/google/gcm/adv.html#canonical

如果規範ID不爲0,那麼你有一個重複註冊。

例如說,你有2名登記在數據庫:

registration_A

registration_B

當您發送推送通知,您的服務器將獲得的東西,看起來像這樣迴應:

{"multicast_id":########,"success":1,"failure":0,"canonical_ids":1,"results": 
[{"registration_id":"new_id_registration_id","message_id":"0:########"}]} 
{"multicast_id":######### ,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:################"}]} 

將此數據存儲在數組中。注意第一個有一個「canonical_ids」:1。這意味着有重複。所以要知道數據庫中的哪個記錄是舊記錄。只需在上面搜索「registration_id」並保存索引值即可。該索引值指向數據庫中的舊記錄。

在上面的例子中,registration_A是舊的registration_id。

從數據庫中獲取所有記錄。然後根據您檢索的索引值刪除它。或者你可以更新它。這取決於你如何設置你的數據庫。

祝你好運!

相關問題