15

我有一個GCM註冊用戶及其在數據庫表中的相應註冊ID的列表,實際上我想要在用戶從表中刪除時取消註冊用戶。我在Stackoverflow中發現了很多示例,但其中大部分都是基於現在已棄用的舊GCMRegistrar API。我使用Google雲端通訊API,並通過以下方法註冊用戶:使用Android中的註冊標識從GCM註銷設備

private void registerUser(){ 
     GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(getBaseContext()); 
     String regId = ""; 
     try { 
      regId = gcm.register(getString(R.string.project_number)); 
      Log.i("registrationId", regId); 
     } 
     catch (IOException e) { 
      Log.i("Registration Error", e.getMessage()); 
     } 
} 

我有一個管理員應用程序,它作爲一個第三方的應用程序服務器,因爲它推通知給所有用戶。我想從這個管理員應用程序註銷特定用戶用下面的方法:

private void unRegister(String regId) { 

     GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(getBaseContext()); 
     try { 
      gcm.unregister(); 
     } 
     catch (IOException e) {  
     System.out.println("Error Message: " + e.getMessage()); 
     } 

    } 

但是它混淆了我,註銷()方法並不需要註冊ID作爲參數,這使得它無法註銷特定的設備。有什麼方法可以通過註冊ID從GCM註銷特定設備?

+1

笑,但你特定設備上運行此代碼** **所以註銷此特定設備... – Selvin 2015-01-21 00:03:50

+0

我在特定的用戶設備上運行「註冊」方法,但我必須從管理員設備取消註冊用戶。 – 2015-01-21 00:04:59

+1

管理員設備? GCM中沒有這種東西 – Selvin 2015-01-21 00:05:47

回答

21

這種方法做的伎倆:

gcm.unregister(); 

然而,gcm.unregister()現在已經過時,因此,您必須使用其中的一個:

InstanceID.deleteToken()或實例id .deleteInstanceID()。

這些方法採取以下參數:

public void deleteToken (String authorizedEntity, String scope) 

得到授權的實體,您要刪除的實體...

//下面的解釋僅適用於「取消註冊」

因此,根據您的意見:

但它讓我感到困惑,註銷()方法不會將註冊 ID作爲參數,因此無法註銷特定的 設備。

這是因爲您期待它以某種方式工作。好像你希望能夠做一個HTTP請求將參數傳遞給uregister(如「http://www.gcmserver.com?unregisterid=xxxx」),這不是它的工作方式,這是它的工作原理基於谷歌文檔的方式:

如何取消註冊工作

應用程序可以在從設備上卸載 之後自動取消註冊。但是,這個過程不會立即發生,因爲Android不提供卸載回調。 發生在這種情況下如下:

最終用戶卸載應用程序。

第三方服務器向GCM服務器發送消息。

GCM服務器將消息發送到設備。

的GCM客戶端接收消息和查詢包管理器被配置爲接收它,這 返回false約 是否有廣播接收器。

GCM客戶端通知GCM服務器已卸載 應用程序。

GCM服務器標記要刪除的註冊ID。

第三方服務器向GCM發送消息。

GCM向第三方服務器返回NotRegistered錯誤消息。

第三方刪除註冊ID。

因此,基於的是,什麼樣的方法gcm.unregister()實際上做的是標記爲刪除(認爲它作爲迫使過程的第一步,而無需實際卸載該應用)該設備,讓服務器知道它不再需要接收通知,也不需要將「Id」作爲參數,這意味着它正在引用該特定設備。

商祺!

+0

GCM需要註銷ID多少時間?我試圖卸載應用程序並通過GCM發送消息。然後,我安裝了應用程序,但我可以使用舊的gcm ID發送消息。 另一個問題;如果用戶重新安裝應用程序會怎麼樣?在這種情況下,設備會重複收到一條消息兩次。因爲在重新安裝應用程序期間,如果GCM不嘗試發送消息,則不會注意到該應用程序已卸載。 在將設備註冊到GCM之前,我是否可以處理這種情況,如果我總是調用gcm.unregister()? – eren130 2015-12-24 07:57:56

+1

如果我想在用戶註銷應用程序時從GCM註銷,該怎麼辦?是否應該創建一個新的IntentService以取消註冊? – JGPhilip 2016-09-27 10:48:51