2014-12-05 46 views
8

我目前正嘗試使用GCM向用戶發送通知,目前我仍在研究如何最大限度地發揮它的作用。現在我只是使用文檔here上提供的示例項目,我使用gcm-client示例來處理它。重新安裝後,應用程序使用GCM接收到重複通知

現在使用這個project from Git我嘗試使用應用程序創建的註冊ID推送消息,並且是成功傳遞消息。

現在的問題是,我卸載應用程序後。重新安裝後,它會生成一個新的註冊ID,我將它與前一個一起存儲在服務器上,不同的是我不能標記以前的註冊ID以便不會收到任何進一步的消息,因爲當用戶沒有互聯網時卸載可能發生連接。之後,我會在重新安裝應用程序之後,將消息發送到兩個註冊ID(它是卸載應用程序之前的ID)和ID。發生什麼事是我收到了兩個推送消息,儘管我預計它只會得到一個,因爲應用程序已經更改了註冊ID。

我預計應用程序可能會收到兩個或更多重複的應用程序,如果我也更新了應用程序,因爲如文檔中所述,註冊ID在更新時可能會更改。

任何解決方法我可以做到處理這個重複的消息?

回答

3

從官方文檔:

How uninstalled client app unregistration works

它 卸載完畢後,客戶端應用程序可以自動註銷。但是,這個過程不會立即發生。 發生在這種情況下是什麼:

  1. 最終用戶卸載客戶端應用程序。
  2. 應用程序服務器向GCM連接服務器發送消息。
  3. GCM連接服務器將消息發送到設備上的GCM客戶端。
  4. 設備上的GCM客戶端收到消息並檢測到客戶端應用程序已被卸載;檢測細節取決於客戶端應用程序運行的平臺。
  5. 設備上的GCM客戶端通知GCM連接 服務器客戶端應用程序已被卸載。
  6. GCM連接服務器 將註冊標記標記爲刪除。
  7. 應用服務器向GCM發送一條 消息。
  8. GCM向 應用程序服務器返回NotRegistered錯誤消息。
  9. 應用服務器應該刪除註冊令牌。

注意 ,這可能需要一段時間登記令牌是從GCM完全 去除。 因此,即使消息 不會傳遞到客戶端應用程序,上面的步驟7 中發送的消息也可能會收到有效的消息ID作爲響應。最終,註冊 令牌將被刪除,服務器將收到一個NotRegistered錯誤, ,而不需要從應用程序服務器採取任何進一步的操作。

但是,它顯然可以發生,你仍然得到舊的註冊ID的通知,如用戶說明其他問題:

對於這個問題,有一個稱爲「canonical IDs」的功能:

Canonical IDs

如果客戶端應用程序中的錯誤觸發的 同一設備的多個註冊,也可以是難以調和的狀態和客戶端應用程序 可能會出現重複的消息。

實施規範ID可以幫助您更輕鬆地從這些 情況中恢復。 規範註冊ID是 的註冊令牌,是客戶端應用程序請求的最後一次註冊。這是服務器在向設備發送消息時應使用的ID 。

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

0

重新安裝後,您將獲得新的RegId和prev無效。因此,即使您向兩個RegI發送推送,只有最後一個會收到。

您可以在應用程序中實現帳戶的邏輯。

例如,當用戶在應用程序中登錄時,您發送他的GoogleId + RegId。重新安裝應用程序並重新登錄後,您只需更新服務器上的RegId。所以,每個用戶只能有一個RegId。

存在問題:只有一個設備會收到推送消息(如果您在具有相同帳戶的2臺設備上登錄)。因此,您可以在啓動應用程序後發送到服務器GoogleId + RegId + DeviceId。

+2

問題是前面的註冊ID仍然收到通知,因爲我提到我的問題。我也預計它是無效的,不會再收到消息,但它仍然收到推送消息。 – KaHeL 2014-12-05 11:56:53

+0

好吧,我想我明白了。反正該應用程序應該爲所有人開放。意味着推送通知的設置被設置爲供公衆使用。如果我使用谷歌身份證,並且當用戶更改登錄名並生成兩個身份證時,我仍然可能會遇到同樣的問題。 – KaHeL 2014-12-05 12:00:21

2

@KaHel當客戶端應用程序被卸載時,regId將在一段時間內有效,您是對的。但是,當客戶端應用程序將被重新安裝並且您的推送服務器嘗試發送舊的註冊ID消息時,該消息將被成功發送,但GCM服務器將cannonical_id作爲響應。你應該用cannonical_id正確處理這個響應。我如何描述at this post並且沒有大的documentation about cannonical_id。即只要您從GCM服務器獲得cannonical_id,您應立即用新的值替換舊的reg_id。它可以讓你不會爲一個客戶產生多個賬戶,只是一對一。

+0

感謝您的信息。我會嘗試閱讀我的日誌。 – KaHeL 2014-12-08 06:58:21

相關問題