Google Cloud Messagingの信頼性を維持

この記事の目的は、Googleの通知サービスを使用する際の最も一般的な落とし穴を理解することです。

私の意見では、このソースは、AndroidデバイスとChromeブラウザー間で通知を同期するための便利なアプリケーションであるPushbulletの開発者からのAndroid向けGoogle Cloud Messaging信頼性の高い記事です。



皆さんがGoogleクラウドメッセージングに関する記事を既に読んでいることを願っています。





レッスン#1:SERVICE_NOT_AVAILABLEを頻繁に受信する準備をする



Implementing GCM Clientの公式ドキュメントでは、この点は完全に無視されています。 したがって、これはGCMに登録するときに知る必要がある最も重要な詳細の1つです。



gcm.register(SENDER_ID)を呼び出します。 IOException "SERVICE_NOT_AVAILABLE"の例外を伴うエラーが頻繁に発生します。



テストデバイスで発生することはなく、準備が整っていない可能性があります。 これは、アプリケーションが既に公開されている瞬間にアプリケーションの信頼性が著しく低下する可能性があり、非常に頻繁に発生するため、非常にマイナスの効果につながる可能性があります。



になる方法 とても簡単です。 このメッセージは、GCMが登録できなかったため、再試行する必要があることを意味します。 この場合のドキュメントでは、 指数関数的に時間待って再試行することを推奨しています。これは素晴らしいアドバイスです。



レッスン#2:ワーカー登録IDが作成された場合でも、繰り返しの登録呼び出しエラーに備える



このアドバイスはかなり奇妙で関連性がないかもしれませんが、GCMのエラーが修正されたことを確認する方法がないため、これも提供します。



エラーは次のとおりです。

gcm.register(SENDER_ID)を何回呼び出すかは関係ありません 一部のデバイスでは常にエラーでクラッシュします。 作業登録IDは正常に作成されたが、関数の結果として返されなかった場合でも。

この登録IDを取得するには、次のイベントのGCM BroadcastReceiverを登録します。

<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
      
      





有効な登録IDを取得する機会が得られます。

 final String registrationId = intent.getStringExtra("registration_id");
      
      





この変数がnullでも空でもない場合、有効な登録IDを取得します。 さらに、通常どおりに保存してサーバーに転送できます。



上記の2つのヒントは、デバイスが正常に登録されていることを確認するのに役立ちます。

次の2つのヒントは、デバイスを再度登録する必要がある場合と、メッセージサービスの継続的な運用を維持するために効果的に登録する方法を示しています。



レッスン3:アプリケーションを更新するたびに、必ずデバイスを再登録してください



このヒントは公式ドキュメントから取られていますが 、スキップするのは非常に簡単なので、忘れないでください。



ユーザーが市場から更新した直後にアプリケーションを開くことはほとんどないため、アプリケーションを自動的に再登録することが非常に重要です。 更新後すぐにメッセージングサービスを動作可能に保つことは非常に重要です。



自動登録プロセスをアクティブにする最良の方法は、 PACKAGE_REPLACEDイベントをリッスンするAndroidManifestでBroadcastReceiverクラスを宣言することです

 <receiver android:name=".UpdateReceiver"> <intent-filter> <action android:name="android.intent.action.PACKAGE_REPLACED" /> <data android:path="<YOUR_PACKAGE_NAME_HERE>" android:scheme="package" /> </intent-filter> </receiver>
      
      





onReceiveメソッドが呼び出された瞬間に、GCM登録を開始できます。 次に、現在の登録IDを新しいものに置き換えて、サーバーに送信します。



あなたが何を呼ぶべきか覚えているといい

 gcm = GoogleCloudMessaging.getInstance(activity); regid = gcm.register(SENDER_ID);
      
      



このメソッドはアプリケーションのメインスレッド(MAIN_THREAD)で呼び出され、ネットワークで直接動作しないため、 onReceive BroadcastReceiverで直接使用する価値はありません。

これらの目的のために、 AsyncTask 、または特別に作成されたバックグラウンドサービス、または最悪の場合はThreadを使用することをお勧めします。





レッスン番号4:デバイスでAndroidのバージョンを更新する場合は、必ずデバイスを再登録してください



これはどこにも文書化されていません(私が知る限り)が、登録IDはAndroidデバイスIDに依存することがわかっています。

デバイスのファームウェアが変更された場合、またはユーザーが工場出荷時設定にリセットした場合(工場出荷時のリセット)に変更される可能性があります。 したがって、Android IDに変更がある場合は、デバイスを再度登録する必要があります。



アプリケーションの更新と同様に、ユーザーがすぐにアプリケーションを起動する可能性は低いため、起動時にGCM登録プロセスが開始される可能性があります。 ユーザーがアプリケーションを起動するのを待たずにメッセージングサービスが機能するように、デバイスを自動的に再登録する必要があります。

これを行う最良の方法は何ですか? これを行う方法は1つしかありませんが、この方法は理想的ではありません。 電話が再起動するたびにアプリケーションを登録する必要があります。 これを行うには、AndroidManifestのアプリケーションに新しい許可を与えます。

 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
      
      





そして、BroadcastReceiverを設定してBOOT_COMPLETEDイベントを受信します。

 <receiver android:name=".BootReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver>
      
      





これで、このリスナーでonReceiveを呼び出すたびに 、デバイスをGCMに再度登録できるようになります。



おそらく、Android IDが実際に変更された場合にのみ、デバイス登録を呼び出す方が正しいでしょう。 重要なことは、この一見オプションの作業の助けを借りて、Android IDが確実に変更されることを100%確信できないため、おそらく不要な場合でもデバイスが登録されたことを確認できることです。



以上です。 GCMの円滑な運用を確保するために、「タンバリンとのダンス」に行かなければならず、これらのポイントのほとんどがGoogle自体によって完全に文書化されていないことさえ悲しいことです。



PMのエラーとタイプミス



All Articles