2013-12-17 14 views
12

GCMプッシュ通知を送信するサーバーアプリがあります。 1000人の受信者を送信するたびに、各登録IDのステータスを示すメッセージが返されます。エラーコードを持つものもあります。どのようにこれらのコードを処理すると私はどのようなすべての可能性のあるエラーコードが何かを教えてくれるGoogleのどこかの文書がありますか?私のGoogleのfooは何も上がっていません。GCMエラーコード

答えて

36

あなたは十分に見苦しくはありませんでした。すべてのコードはhereの下にInterpreting an error responseと記載されています。

私は唯一の答え、それはリンクにならないためには、それをコピー&ペーストしようとしましたが、フォーマットは少しオフになっている。ここでは、エラー応答に

の解釈

ですデバイスにメッセージを送信しようとしたときに発生する可能性があるエラー の異なる種類を扱うための推奨事項:登録IDがありません

リクエストに登録ID(プレーンテキストメッセージのregistration_idパラメータ、またはJSONの registration_idsフィールド)が含まれていることを確認します。 エラーコードが見つからない場合に発生します。

無効な登録ID サーバーに渡す登録IDのフォーマットを確認してください。電話番号が のcom.google.android.c2dm.intent.REGISTRATIONインテントで受信した登録IDと一致していること、および がそれを切り捨てたり、追加の文字を追加したりしていないことを確認してください。 エラーコードがの場合、無効な登録が発生します。

不一致送信者 登録IDは特定の送信者グループに関連付けられています。アプリケーションがGCMの使用を登録するときは、どの送信者が メッセージの送信を許可されているかを指定する必要があります。 メッセージをデバイスに送信しようとしているときに、そのうちの1つを使用していることを確認してください。異なる 送信者に切り替えると、既存の登録IDは機能しません。エラー のコードがMismatchSenderIdの場合に発生します。

未登録デバイス 既存の登録IDを含む、多くのシナリオにおいて有効であることをやめることができる:アプリケーションを手動com.google.android.c2dm.intentを発行することにより、登録解除場合

  • 。 UNREGISTERインテント。
  • アプリケーションが自動的に登録抹消された場合、ユーザーがアプリケーションをアンインストールした場合に発生する可能性がありますが、保証はできません。
  • 登録IDが期限切れの場合。 Googleは登録IDを更新することがあります。
  • アプリケーションが更新されても、新しいバージョンにcom.google.android.c2dm.intent.RECEIVEインテントを受信するように構成されたブロードキャストレシーバーがない場合。

このような場合は、この登録IDをサードパーティのサーバーから削除し、メッセージの送信を停止する必要があります。 エラーコードがで、登録されていないの場合に発生します。

メッセージが多すぎます メッセージに含まれるペイロードデータの合計サイズは4096バイトを超えることはできません。これには、 キーのサイズと値の両方が含まれます。 エラーコードがMessageTooBigの場合に発生します。

無効データキー ペイロードデータは、キー含有(例えば、Googleによる接頭値から、またはいずれかとします。) com.google.android.c2dm.intent.RECEIVEインテントにGCMによって内部的に使用されていること、および使用できません。 では、GCMでは一部の単語(collapse_keyなど)も使用されていますが、ペイロードには が許可されています。この場合、ペイロードの値はGCM値によってオーバーライドされた になります。 エラーコードがの場合、InvalidDataKeyが発生します。フィールドの生存時間のため 値を生きて

無効時間は0と2419200(4週間)の間の秒単位の時間を表す整数でなければなりません。 エラーコードがの場合、InvalidTtlが発生します。

認証エラー メッセージの送信に使用しようとしている送信者アカウントを認証できませんでした。考えられる原因は次のとおりです。

  • 承認ヘッダーが見つからないか、構文が無効です。
  • 無効なプロジェクト番号がキーとして送信されました。
  • キーは有効ですが、GCMサービスが無効です。
  • 要求は、サーバーキーIPでホワイトリストに登録されていないサーバーから発生します。

Authorizationヘッダー内に送信するトークンが、プロジェクトに関連付けられている正しいAPIキーであることを確認します。あなたは 次のコマンドを実行して、あなたのAPIキーの有効性を確認することができます。

API_KEY = YOUR_API_KEY

カール--header "認可:キー= $ API_KEY": "アプリケーション/ jsonのContent-Typeの--header 「https://android.googleapis.com/gcm/send -d」{\ "registration_ids \":[\ "ABC \"]} "

401 HTTPステータスコードを受け取った場合、APIキーは無効です。そうでないと、次のようなメッセージが表示されます。

{"multicast_id":6782339717028231855、 "成功":0、 "失敗":1、 "canonical_ids":0、 "results":[{"error": "InvalidRegistration" }]}

登録IDの有効性を確認するには、「ABC」を登録IDに置き換えます。 HTTPステータスコードが401の場合に発生します。

タイムアウト サーバーが時間内に要求を処理できませんでした。

GCMサーバーからの応答に含まれている場合は、Retry-Afterヘッダーを受け入れる必要があります。 再試行メカニズムで指数関数的なバックオフを実装します。これは、再試行が失敗するたびに指数関数的に増加する遅延を意味します(たとえば、最初の再試行前に1秒間待っていた場合は、 )、次の試行の前に少なくとも2秒待ってから4秒間待ってください。 複数のメッセージを送信している場合は、 のメッセージをすべて同時に新規に要求しないように、ランダムに追加して ランダムにそれぞれを遅延させてください。 問題を引き起こす送信者はブラックリストに載る危険があります。 HTTPステータスコードが501〜599の場合、または結果配列のJSONオブジェクトのエラーフィールドが になっていない場合に発生します。

内部サーバーエラー 要求の処理中にサーバーでエラーが発生しました。同じリクエストを再試行することができます(タイムアウトセクションに記載されている の要件に従ってください)が、エラーが続く場合は、 で問題をアンドロイド-gcmグループに報告してください。 HTTPステータスコードが500の場合、または結果配列のJSONオブジェクトのエラーフィールドがInternalServerErrorの場合に発生します。

無効なパッケージ名パッケージ名がリクエストで渡された値と一致しない登録IDを持つメッセージが送信されました。エラーコードがの場合、InvalidPackageNameが発生します。

EDIT(2015年6月6日):

新しいエラー応答コードテーブルはhere投稿されています。

新しいエラー応答:

デバイスメッセージのレートは、特定のデバイスへのメッセージの割合が高すぎるを超えています。このデバイスに送信されるメッセージの数を減らし、すぐにこのデバイスへの送信を再試行しないでください。

トピックメッセージレートが超過しました特定のトピックに対するサブスクライバへのメッセージのレートが高すぎます。このトピックで送信されるメッセージの数を減らし、直ちに送信を再試行しないでください。

+0

ありがとう、Eran!私はページのその部分を何度か見ていると言うのは恥ずかしいです。私はそれのフォーマットが私を捨てたと思う。 –

+2

@Eran回答のリンクにもうコンテンツがありません:http://developer.android.com/google/gcm/http.html#error_codes 先週、私はそれらのコンテンツを見ることができました。週末に何が起こったのか分かりません。 –

+0

@TamilVendhanKanagarajuまあ、その場合は、内容がここにあるのは良いことです。 – Eran