29

奇妙な問題が発生しました。アプリケーションで GCM をかなり長い間使用しており、すべてが完全に機能しています。ただし、Google Play にリリースする前に、アプリケーションのパッケージ名を から に変更com.android.testappcom.android.recognition、その後、この GCM が機能しなくなりました。最初はエラーが出GCM sender id not set on constructorてオーバーライドして直しgetSenderIds(Context context)たのですが、今は登録IDが取得できません。logcat からのメッセージは次のとおりです。 ここに画像の説明を入力

どうすればこれを修正できますか? 新しいパッケージに切り替えたとき、マニフェスト ファイル内のすべてを新しいパッケージに変更しました。

<receiver
        android:name="com.google.android.gcm.GCMBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
            <category android:name="com.android.recognition" />
        </intent-filter>
    </receiver>

では、この背後にある問題は何ですか?アプリケーション パッケージの名前を変更すると、この問題が発生する可能性がありますか?それとも別の理由がありますか?

4

17 に答える 17

22

SERVICE_NOT_AVAILABLEは、Google Cloud Messaging で最もイライラする問題の 1 つです。GoogleCloudMessaging.register(SENDER_ID)これは、プッシュ通知用にデバイスを登録し、登録 ID を返す関数呼び出しによってスローされる例外です。

  1. SERVICE_NOT_AVAILABLE は、ユーザーのデバイスが登録要求に対する応答を読み取ることができないか、サーバーから 500/503 エラー コードが返されたことを意味する可能性があります。このエラーは Google 側にあるため、開発者が修正する方法はありません。そのため、ユーザーに数時間後に再試行するよう盲目的に提案できます。
  2. 一部のデバイスでは、登録が成功しても SERVICE_NOT_AVAILABLE が発生する場合があります。これは、呼び出しが失敗したときにトークンをキャッチする回避策のブロードキャスト レシーバーを実装することで修正できます。この回避策を実装したところ、一部のユーザーの問題が解決した可能性がありますが、他にも多くの SERVICE_NOT_AVAILABLE に関する苦情が寄せられました。
  3. SERVICE_NOT_AVAILABLE は、デバイスの Google Play Services ライブラリが古いか見つからないために発生する可能性があります。この場合、アプリは理論的には、それぞれの Google Play アプリのリストを開くことで、Google Play サービスを更新するようにユーザーに通知できます。ただし、アプリはこれが SERVICE_NOT_AVAILABLE がスローされた理由であることを認識していないため、ユーザーを Google Play の Google Play Services アプリ ページにやみくもにリダイレクトすることはできません。
  4. SERVICE_NOT_AVAILABLE は、デバイスのクロックがネットワークと同期されていない場合に発生することがあります。繰り返しますが、開発者はこれが正確な問題であることを知る方法がないため、システム クロックの同期を確認するようユーザーにやみくもに提案できます。クロックが同期されていない数少ないユーザーの 1 人であることを願っています。
  5. SERVICE_NOT_AVAILABLE は、ルート化されたユーザーがデバイスからハングアウト/GTalk アプリを削除した場合に発生する可能性があります (ブロートウェアと見なされたため)。GCM は Hangouts/GTalk によって実装および処理されるため、GCM なしでは GCM を使用できません。
  6. 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 を設立し、多くのアプリがそのようなサービスから恩恵を受けることに気付きました)

于 2015-04-08T09:30:09.060 に答える
18

マニフェストの権限部分でパッケージ名を変更したことを確認してください。

<permission android:name="YOUR_PACKAGE_NAME.permission.C2D_MESSAGE"
    android:protectionLevel="signature" />
<uses-permission android:name="YOUR_PACKAGE_NAME.permission.C2D_MESSAGE" />

その部分のパッケージ名が正しくないため、同様のエラーが発生しました。

于 2013-06-19T12:44:33.133 に答える
3

私にとっては、接続の問題がありました。インターネット接続を変更すると問題が解決しました

于 2014-10-22T07:06:00.430 に答える
3

私にとっては、Galaxy S4のデータ使用オプションで「バックグラウンドデータを制限する」をチェックして、Googleサービスの「バックグラウンドデータアクセス」をオフにしました。電源を入れるとすぐに、セラーネットワークで問題が解決しました。Wifiでは問題なく動作しました。

于 2015-01-11T20:26:50.977 に答える
2

私にとっての問題は、電話がインターネットに接続されていなかったことです。Wi-Fi を切断して接続し、ブラウザとの接続をテストして、再度テストしました。魅力のように働きました:-)

于 2016-07-31T20:05:03.953 に答える
0

Google サービスの「バックグラウンド データ アクセス」をオフにしました。データ使用オプションの「バックグラウンドデータを制限する」のチェックを外すことで、うまくいきます!

于 2015-04-29T13:00:11.840 に答える
0

データ時にプッシュを受信できない OnePlus2 がありました。に接続したときにlogcat、このエラーがたくさん表示されましたが、関連しているかどうかはわかりません。

それに対応する設定を見つけるのをあきらめ、デバイスを工場出荷時設定にリセットしました。OxygenOS を実行している OnePlus デバイスでは、ソフトウェアの更新をインストールするときに奇妙な構成エラーが発生することがあり、工場出荷時設定にリセットした後に Google バックアップから復元すると、根本的な問題を理解するよりも速く機能するようになります (ユーザーが持っていない可能性さえあります)。根本的な問題を修正するための適切なアクセス)。

于 2018-05-24T14:45:51.873 に答える
0

私にとって、SERVICE_NOT_AVAILABLEの問題は、レシーバークラスが原因でアプリケーションプロジェクトにありました。そこで、以下のようにレシーバーを実装したら解決しました。 <receiver android:name="receiver name" android:permission="com.google.android.c2dm.permission.SEND"> <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE"/> <action android:name="com.google.android.c2dm.intent.REGISTRATION"/> <category android:name="your package"/> </intent-filter> </receiver> 私はそれがあなたを助けることを願っています:-)。

于 2016-08-31T08:09:15.117 に答える
-1

長い闘争の後、私はこの問題を解決することができました。Google Play 開発者サービス アプリが最新であること、およびそのバックグラウンド同期が携帯電話で無効になっていないことを確認してください。

于 2017-01-11T19:40:09.043 に答える