2013-12-17 47 views
12

我有一個服務器應用程序發送GCM推送通知。每發送1000個收件人都會返回一條消息,告訴我每個註冊ID的狀態。有些會有錯誤代碼。是否有來自Google某處的文檔告訴我我該如何處理這些代碼以及所有可能的錯誤代碼是什麼?我的谷歌foo沒有提供任何東西。GCM錯誤代碼

回答

36

你看起來不夠硬。所有代碼在Interpreting an error response下解釋爲here

我試過,以複製和粘貼它不是一個鏈接只能回答,但格式是有點過:

口譯的錯誤響應

這裏有推薦處理嘗試向設備發送消息時可能發生的不同類型的錯誤 :

缺少註冊ID 檢查請求是否包含註冊ID(在純文本消息的registration_id參數中或在JSON中的 registration_ids字段中)。 錯誤代碼爲MissingRegistration時發生。

無效的註冊ID 檢查您傳遞給服務器的註冊ID的格式。請確保它與 com.google.android.c2dm.intent.REGISTRATION意圖中手機收到的註冊ID相匹配,並確保您的 不會截斷它或添加其他字符。 錯誤代碼爲無效註冊時發生。

不匹配的發件人 註冊ID綁定到某個發件人組。當應用程序註冊GCM使用情況時,它必須指定允許哪些發件人發送消息 。確保在使用 嘗試向設備發送消息時使用其中的一種。如果您切換到其他 發件人,現有的註冊ID將不起作用。發生錯誤時發生 代碼爲MismatchSenderId

未註冊裝置 現有的註冊ID可能不再有效在許多場景,包括:

  • 如果應用程序通過手動發出com.google.android.c2dm.intent註銷。註冊意向。
  • 如果應用程序自動取消註冊,如果用戶卸載應用程序可能發生(但不能保證)。
  • 如果註冊ID過期。 Google可能會決定刷新註冊ID。
  • 如果應用程序已更新,但新版本沒有配置爲接收com.google.android.c2dm.intent.RECEIVE意圖的廣播接收器。

對於所有這些情況,您應該從第三方服務器中刪除此註冊ID並停止使用它來發送消息。 當錯誤代碼爲未註冊時發生。

消息太大 消息中包含的有效負載數據的總大小不能超過4096字節。請注意,這包括 鍵的大小以及值。 錯誤代碼爲MessageTooBig時發生。

無效數據鍵 有效載荷數據包含的密鑰(如從或通過谷歌前綴的任何值。),其在 com.google.android.c2dm.intent.RECEIVE意圖通過GCM內部使用和不能使用。注意 有些詞(如collapse_key)也被GCM使用,但在有效載荷中允許使用 ,在這種情況下,有效載荷值將由GCM值覆蓋 。 錯誤代碼爲InvalidDataKey時發生。

無效生存時間 的值的生存時間字段必須是表示0和2419200(4周)之間在秒的持續時間的整數。 錯誤代碼爲InvalidTtl時發生。

身份驗證錯誤 您嘗試用來發送消息的發件人帳戶無法進行身份驗證。可能的原因有:

  • 授權標題丟失或語法無效。
  • 作爲關鍵字發送的項目編號無效。
  • 密鑰有效,但禁用了GCM服務。
  • 源自服務器密鑰IP中未列入白名單的服務器的請求。

檢查您在授權標頭內發送的令牌是否與您的項目相關的正確API密鑰。

API_KEY = YOUR_API_KEY

捲曲--header 「授權:鍵= $ API_KEY」 --header的Content-Type:「應用/ JSON通過運行以下命令可以 檢查您的API密鑰的有效性「https://android.googleapis.com/gcm/send -d」{\「registration_ids \」:[\「ABC \」]}「

如果您收到401 HTTP狀態碼,則說明您的API密鑰無效。否則你應該看到類似這樣的內容:

{「multicast_id」:6782339717028231855,「success」:0,「failure」:1,「canonical_ids」:0,「results」:[{「error」:「InvalidRegistration」 }]}

如果要確認註冊ID的有效性,可以通過將「ABC」替換爲註冊ID來實現。 當HTTP狀態碼是401時會發生。

超時 服務器無法及時處理請求。您應該重試相同的請求,但您必須遵守以下要求:

如果包含在來自GCM服務器的響應中,請確認Retry-After標題。 在您的重試機制中實現指數回退。這意味着在每次重試失敗後指數增加的延遲(例如,如果您在第一次重試之前等待一秒,則在下一個等待至少兩個 秒,然後等待4秒等等時爲 )。如果您要發送多個郵件,請將每個郵件獨立延遲 附加隨機數,以避免同時發出對所有郵件的新請求。 引起問題的發件人被列入黑名單。 HTTP狀態碼介於501和599之間時,或者結果數組中的JSON對象的錯誤字段爲 不可用時發生。

內部服務器錯誤 服務器在嘗試處理請求時遇到錯誤。您可以重試相同的請求(服從「超時」部分列出的要求 ),但如果錯誤仍然存​​在,請 在android-gcm組中報告問題。 HTTP狀態碼爲500時,或者結果數組中的JSON對象的錯誤字段爲InternalServerError時發生。

無效的程序包名稱消息被髮送到其程序包名稱與請求中傳遞的值不匹配的註冊ID。錯誤代碼爲InvalidPackageName時發生。

編輯(2015年6月6日):

一個新的錯誤響應碼錶已發佈here

新的錯誤響應:

裝置消息率超過消息到特定設備的速率過高。減少發送到此設備的消息數量,並且不要立即重試發送到此設備。

主題消息速率超出訂閱者對特定主題的消息速率太高。減少爲此主題發送的消息數量,並且不要立即重試發送。

+0

謝謝,伊蘭!我很慚愧地說我多次瀏覽了頁面的這一部分。我認爲它的格式讓我失望。 –

+2

@Eran Link在答案中沒有內容:http://developer.android.com/google/gcm/http.html#error_codes 上週我能看到這些內容。我不確定週末發生了什麼事。 – 2015-03-27 06:02:34

+0

@TamilVendhanKagagaraju那麼,在這種情況下,這裏的內容是件好事。 – Eran