SERVICE_NOT_AVAILABLEは、Google Cloud Messaging で最もイライラする問題の 1 つです。GoogleCloudMessaging.register(SENDER_ID)
これは、プッシュ通知用にデバイスを登録し、登録 ID を返す関数呼び出しによってスローされる例外です。
- SERVICE_NOT_AVAILABLE は、ユーザーのデバイスが登録要求に対する応答を読み取ることができないか、サーバーから 500/503 エラー コードが返されたことを意味する可能性があります。このエラーは Google 側にあるため、開発者が修正する方法はありません。そのため、ユーザーに数時間後に再試行するよう盲目的に提案できます。
- 一部のデバイスでは、登録が成功しても SERVICE_NOT_AVAILABLE が発生する場合があります。これは、呼び出しが失敗したときにトークンをキャッチする回避策のブロードキャスト レシーバーを実装することで修正できます。この回避策を実装したところ、一部のユーザーの問題が解決した可能性がありますが、他にも多くの SERVICE_NOT_AVAILABLE に関する苦情が寄せられました。
- SERVICE_NOT_AVAILABLE は、デバイスの Google Play Services ライブラリが古いか見つからないために発生する可能性があります。この場合、アプリは理論的には、それぞれの Google Play アプリのリストを開くことで、Google Play サービスを更新するようにユーザーに通知できます。ただし、アプリはこれが SERVICE_NOT_AVAILABLE がスローされた理由であることを認識していないため、ユーザーを Google Play の Google Play Services アプリ ページにやみくもにリダイレクトすることはできません。
- SERVICE_NOT_AVAILABLE は、デバイスのクロックがネットワークと同期されていない場合に発生することがあります。繰り返しますが、開発者はこれが正確な問題であることを知る方法がないため、システム クロックの同期を確認するようユーザーにやみくもに提案できます。クロックが同期されていない数少ないユーザーの 1 人であることを願っています。
- SERVICE_NOT_AVAILABLE は、ルート化されたユーザーがデバイスからハングアウト/GTalk アプリを削除した場合に発生する可能性があります (ブロートウェアと見なされたため)。GCM は Hangouts/GTalk によって実装および処理されるため、GCM なしでは GCM を使用できません。
- SERVICE_NOT_AVAILABLE は、ユーザーが Google API がインストールされていないデバイス (Amazon Kindle など) を実行している場合に発生する可能性があります。ここでは何もする必要はありません。これらのユーザーはアプリからプッシュ通知を受け取ることはありません。
詳細:
http://eladnava.com/google-cloud-messaging-extremely-unreliable/
これらの問題だけでも、GCM の代替品を探し始めるには十分でした。SERVICE_NOT_AVAILABLE がスローされたときに表示されるエラー メッセージを含むコメントとともに、毎日、1 日か 2 日、自分のアプリで 1 つ星のレビューを受け取ります。これらのユーザーを助けるために私にできることは何もありませんでした.
Google クラウド メッセージングの代替手段
Pushy ( https://pushy.me/ ) は、GCM から完全に独立したスタンドアロンのプッシュ通知ゲートウェイです。プッシュ通知を受信するために、GCM と同様に独自のバックグラウンド ソケット接続を維持します。基礎となるプロトコルは MQTT です。これは非常に軽量な pub/sub プロトコルであり、ネットワーク帯域幅とバッテリーをほとんど使用しません。
Pushy の大きな利点は、(サーバーから) プッシュ通知を送信し、プッシュ通知用にデバイスを登録するためのコードが、実際には GCM と Pushy の間で交換可能であることです。これにより、GCM を実装し、不安定性のために GCM を捨てなければならなかった後で、Pushy に切り替えるのが非常に簡単になります。
(完全な開示: 私は自分のプロジェクトのために Pushy を設立し、多くのアプリがそのようなサービスから恩恵を受けることに気付きました)