義援金の受付

東日本大震災の
復興支援へのご寄付
をお願い致します。

Android クラウド to デバイス メッセージング フレームワーク

Android クラウド to デバイス メッセージング ( C2DM: Cloud to Device Messaging ) とは、開発者がサーバから Android 上のアプリケーションにデータを送信することができるようにするサービスです。このサービスは、シンプルで軽量なメカニズムで、サーバがモバイルアプリケーションに対してサーバに直接コンタクトするように通知を行い、アプリケーションやユーザデータを更新する目的で使用することができます。C2DM サービスは、メッセージのキューイングのすべての側面と、ターゲットデバイスで実行中の対象のアプリケーションへの配信をハンドリングします。

注意: Android の C2DM は、すべての開発者が利用できるようになりました。Android アプリケーションで C2DM を使用するために、サインアップページ でアクセスのリクエストをしてください。

目次

  1. まえがき
  2. アーキテクチャーの概要
    1. ライフサイクルのフロー
    2. ユーザはどうすればいいのか?
  3. C2DM を使った Android アプリケーションの作成
    1. マニフェストの作成
    2. C2DM の登録
    3. C2DM からの登録解除
    4. 登録結果のハンドリング
    5. 受信データのハンドリング
    6. アプリケーションの開発とテスト
  4. サードパーティアプリケーションサーバの役割
    1. アプリケーションサーバのメッセージ送信方法
  5. 実例集
  6. 制限事項

まえがき

ここで、Android クラウド to デバイスメッセージング (C2DM) の特徴を挙げます。

  • これによりサードパーティのアプリケーションサーバが軽量なメッセージを Android アプリケーションに送信することができます。メッセージングサービスは、メッセージを用いて大きなユーザコンテンツを送信するために設計されたものではありません。というよりは、サーバに新しいデータがあるということをアプリケーションに知らせることが目的であり、それでアプリケーションがそのデータを取りに行くことができるのです。
  • C2DM は配信やメッセージの順序についての保証はありません。よって、例えば、ユーザに新しいメッセージが届いていることをインスタントメッセージのアプリケーションに知らせ、実際のメッセージは渡さないという使い方でこの機能を使用する方が良いでしょう。
  • Android デバイスのアプリケーションは、メッセージを受信するための処理を実行しておく必要はありません。アプリケーションに適切なブロードキャストレシーバと許可さえあれば、メッセージが到着したときにシステムがインテントのブロードキャストでアプリケーションを起動します。
  • メッセージデータ用に専用のユーザインターフェイスやその他のハンドリングは提供していません。C2DM が単純の生のメッセージデータを受信し、そのままアプリケーションに渡し、アプリケーションがそのハンドリングをすべて制御します。例えば、アプリケーション側で通知をポストし、カスタムのユーザインターフェイスを表示したり、ひそかにデータを同期したりします。
  • Android 2.2 以上が動いているデバイスでマーケットアプリケーションがインストールされていることが必須です。しかしながら、マーケットを通してアプリケーションをデプロイするという制限はありません。
  • これは、Google サービスに対する既存の接続を使用します。モバイルデバイスには Google のアカウントを設定しておく必要があります。

アーキテクチャーの概要

このセクションでは、C2DM がどのように動作するのかについての概要を提供します。

この表で C2DM に関連する主な用語とコンセプトをまとめています。これは以下のカテゴリに分けられます。

  • コンポーネント — C2DM で役割を果たす物理的な実体です。
  • 認証 — C2DM のあらゆる場面で使用される ID と トークンで、すべての団体で認証され、メッセージが正しい場所に到着することを保証するためのものです。
コンポーネント
モバイルデバイス C2DM を使った Android アプリケーションが実行しているデバイス。これはマーケットがインストールされた 2.2 の Android デバイスで、少なくとも 1 つは Google のアカウントにログインする必要があります。
サードパーティー
アプリケーション
サーバ
C2DM が実装されたアプリケーションがその部品としてセットアップされたアプリケーションサーバ。サードパーティのアプリケーションサーバは、C2DMサーバ を介してデバイスの Android アプリケーションにデータを送信します。
C2DM サーバ サードパーティアプリケーションサーバからのメッセージの受け取りとデバイスへの送信に関与する Google のサーバ。
認証
センダー ID アプリケーションの開発者と関連付けされた email アカウント。センダー ID は、登録処理 でデバイスにメッセージを送信する許可が与えられた Android アプリケーションを識別するために使用されます。これは通常、個人的なアカウントとしてではなく、ロールとしての目的があります。my-app@gmail.com がその例です。
アプリケーション ID メッセージを受信することを登録中のアプリケーション。アプリケーションは マニフェスト からのパッケージ名で識別されます。
登録 ID Android アプリケーションのメッセージ受信を可能とするための C2DM サーバにより発行された ID 。一旦アプリケーションが登録 ID を保持すると、サードパーティのアプリケーションサーバにそれを送信し、サーバはその ID を、アプリケーションがメッセージの受信可能な登録済みの各デバイスを識別する目的で使用します。言い換えると、登録 ID が特定のデバイスで実行中の特定のデバイスとをひも付けを行います。
Google
ユーザアカウント
C2DM を動作させるために、モバイルデバイスは少なくとも 1 つの Google アカウントでログインする必要があります。
センダー 認証
トークン
Google サービスにアクセスが認可されたアプリケーションサーバを提供するサードパーティのアプリケーションサーバに保存された ClientLogin 認証トークン。このトークンはメッセージを送信する POST リクエストに含められます。ClientLogin 認証トークンについての詳しい解説は、インストール済みアプリケーションに対する ClientLogin を参照してください。

ライフサイクルのフロー

ここでクラウド to デバイスメッセージングに関連する主なプロセスを挙げます。

  • C2DM の有効化 。 モバイルデバイスで実行中のアプリケーションがメッセージの受信するために登録を行います。
  • メッセージの送信 。 サードパーティーのアプリケーションサーバがデバイスにメッセージを送信します。
  • メッセージの受信 。 Android アプリケーションが C2DM サーバからメッセージを受信します。

これらのプロセスを以下で詳しく述べていきます。

C2DM の有効化

これは、モバイルデバイスで実行中の Android アプリケーションがメッセージを受信するための登録を行ったときに発生するイベントのシーケンスです。

  1. アプリケーションがメッセージングサービスの使用が必要となったときに初めて、C2DM サーバに登録のインテントを投げます。

    この登録のインテント ( com.google.android.c2dm.intent.REGISTER ) には、センダー ID ( つまり、アプリケーションにメッセージを送信することを認可されたアカウントで、通常これはアプリケーションの開発者によってセットアップされたアカウントの email アドレスです ) とアプリケーション ID が含まれています。

  2. 登録に成功したら、C2DM サーバがアプリケーションに登録 ID を提供する REGISTRATION インテントをブロードキャストします。

    アプリケーションはこの ID を後で使うために取って置おかなければなりません。Google は定期的に登録 ID をリフレッシュすることがあることから、アプリケーションの設計では、 REGISTRATION インテントが何回呼ばれても対応できる設計にしておく必要があるという点に注意してください。アプリケーションはそれなりに応答ができるようにしておく必要があるのです。

  3. 登録を完了させるため、アプリケーションは登録 ID をアプリケーションサーバに対して登録 ID を送信します。通常アプリケーションサーバは登録 ID をデータベースに保存します。

この登録 ID はアプリケーション自身が明示的に登録解除を行うか、Google がアプリケーションの登録 ID をリフレッシュするまで継続して使えます。

メッセージの送信

アプリケーションサーバがメッセージを受信すると、以下のような環境が整います。

  • アプリケーションが特定のデバイスに対してメッセージ受信を可能とする登録 ID を保持します。
  • サードパーティのアプリケーションサーバが登録 ID を保存を完了します。

アプリケーションがメッセージを送信するための必要な準備がもうひとつありますが、それは ClientLogin 認証のトークン です。これは開発者がアプリケーションに対してアプリケーションサーバですでにセットアップを完了させておく必要がある作業です ( 詳しい解説は サードパーティのアプリケーションサーバの役割 参照 ) 。これでデバイスにメッセージを送信する準備ができました。

ClientLogin トークンはアプリケーションサーバに対して特定の Android デバイスにメッセージを送信することを認証します。アプリケーションサーバは、ひとつの特定のサードパーティーアプリに対してひとつの ClientLogin トークンと、複数の登録 ID を保持します。それぞれの登録 ID がサードパーティーのアプリに対してメッセージングサービスを使用する登録を行った特定のデバイスを表しています。

これは、アプリケーションサーバがメッセージを送信したときに発生するイベントのシーケンスです。

  1. アプリケーションサーバが C2DM サーバにメッセージを送信します。
  2. Google はデバイスが万が一アクティブになっていない場合に備えて、メッセージを待ち行列に貯め、保存します。
  3. デバイスがオンラインのとき、Google はデバイスにメッセージを送信します。
  4. デバイス上で、 システムが適切な許可付きのインテントブロードキャストを用いて特定のアプリケーションにメッセージをブロードキャストすることにより、ターゲットとなるアプリケーションだけがメッセージを取得するようになります。これによりアプリケーションが起動されます。メッセージを受信するために、あらかじめアプリケーションを実行しておく必要はありません。
  5. アプリケーションはメッセージを処理します。アプリケーションが重要な処理を行っている場合は、ウェイク ロック を横取りしてサービスでなんらかの処理を行うのがいいでしょう。

アプリケーションは、もうメッセージを受信する必要がなくなった場合に登録を解除することができます。

メッセージの受信

これは、モバイルデバイスで Android アプリケーションがメッセージを受信したときのイベントのシーケンスです。

  1. システムは入ってきたメッセージを受信し、メッセージ本体からキーと値のペアを生のデータとして取り出します。
  2. システムはキーと値のペアをターゲットとなる Android アプリケーションに、 com.google.android.c2dm.intent.RECEIVE インテントで追加情報 ( exstra ) のセットとして渡します。
  3. Android アプリケーションが、生のデータを RECEIVE インテントからキーで取り出し、データを処理します。

ユーザはどうすればいいのか?

モバイルデバイスのユーザが C2DM を含むアプリケーションをインストールしたとき、アプリケーションに C2DM が含まれていることをユーザに知らせて、Android マーケットからの許可を得ます。ユーザがこのアプリケーションをインストールするには、この機能を使用することに同意しなければなりません。アプリケーションの実装によっては、ユーザにはメッセージ受信の登録を解除する選択肢を提供しておいた方がいいでしょう。アプリケーションのアンインストールしても、登録を解除したことになります。

C2DM を使った Android アプリケーションの作成

C2DM を使用する Android アプリケーションを作成するには、サードパーティーアプリケーションサーバの役割 で説明した役割を実行するアプリケーションサーバを用意する必要があります。このセクションでは、C2DM を使用するクライアントアプリケーションを作成するための手順を説明します。

C2DM フレームワークに関連するユーザインターフェイスはないことを覚えておいてください。必要に応じて、アプリケーションでメッセージを処理するかは開発者次第です。

クライアントアプリケーションの作成に関する主な手順は以下の 2 つです。

  • アプリケーションが C2DM の使用に必要な許可を含むマニフェストの作成。
  • Java コードを実装します。C2DM を使うには、以下の実装を加える必要があります。
    • 登録サービスの開始と停止を行うコード。
    • com.google.android.c2dm.intent.C2D_MESSAGEcom.google.android.c2dm.intent.REGISTRATION に対するレシーバー。

マニフェストの作成

すべてのアプリケーションで AndroidManifest.xml ( まさにこの名前で ) ファイルがそのルートディレクトリに必要です。マニフェストは、アプリケーションに関する必要不可欠な情報、アプリケーションのコードを実行するなによりも前にシステムが持ち合わせていなければならない情報を、Android システムに提示します ( マニフェストファイルの詳しい解説は、 Android 開発ガイド を参照してください ) 。 C2DM 機能を使用するためには、マニフェストに以下を加える必要があります。

  • com.google.android.c2dm.permission.RECEIVE で、アプリケーションが登録とメッセージの受信が許可されることを提示します。
  • android.permission.INTERNET で、アプリケーションがレシーバのキーをサードパーティーサーバへの送信が許可されることを提示します。
  • applicationPackage + ".permission.C2D_MESSAGE で、他のアプリケーションによる登録と、このアプリケーションのメッセージを受信することを回避します。
  • applicationPackage として設定されたカテゴリを付けて com.google.android.c2dm.intent.RECEIVEcom.google.android.c2dm.intent.REGISTRATION に対するレシーバーを加えます。レシーバーには com.google.android.c2dm.SEND の許可が必須で、そうすることで C2DM フレームワークのみが、そのメッセージをレシーバーに送信できるようになります。登録とメッセージの受信の両方が インテント として実装されている点に注目してください。
  • C2DM の機能がアプリケーションの機能に絶対必要な場合は、マニフェストに必ず android:minSdkVersion="8" をセットしてください。これにより、アプリケーションが適切に動作しない可能性のある環境にインストールできないことを保証してくれます。

受信した C2D_MESSAGE インテントにはサードパーティーサーバーにより追加情報として、すべてキーと値のペアで送信されます。特別な collapse_key というキーがひとつあり、これは、オフラインのデバイスを待ってメッセージをハンドリングできるようにする目的で、センダーにより特定されます。

以下は C2DM をサポートするマニフェストの例です。

<manifest package="com.example.myapp" ...>

<!-- このアプリケーションだけがメッセージの受信と登録の結果の受信が可能 -->
<permission android:name="com.example.myapp.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="com.example.myapp.permission.C2D_MESSAGE" />

<!-- このアプリケーションは登録とメッセージ受信の許可がある -->
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />

<!-- 登録 ID をサーバに送信する -->
<uses-permission android:name="android.permission.INTERNET" />

<!-- C2DM サーバのみがアプリにメッセージを送信できる。許可がセットされないと、他のどのアプリでもこれを生成できてしまう -->
<receiver android:name=".C2DMReceiver" android:permission="com.google.android.c2dm.permission.SEND">
<!-- 実際のメッセージの受信 -->
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="com.example.myapp" />
</intent-filter>
<!-- 登録 ID の受信 -->
<intent-filter>
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="com.example.myapp" />
</intent-filter>
</receiver>

C2DM の登録

Android アプリケーションはメッセージを受信する前に、必ず C2DM の登録が必要です。その登録には、以下の 2 つの追加パラメータを使ってインテント  (com.google.android.c2dm.intent.REGISTER) を送信する必要があります。

  • sender はアプリケーションにメッセージを送信するために認証されたアカウントの ID で、一般にアプリケーションの開発者によりセットアップされた email アドレスです。
  • app はアプリケーション ID で、登録のサービスがアプリケーションの情報を抜き出せるように、PendingIntent を使って設定されます。

例:

Intent registrationIntent = new Intent("com.google.android.c2dm.intent.REGISTER");
registrationIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0)); // お決まりのコード
registrationIntent.putExtra("sender", emailOfSender);
startService(registrationIntent);

アプリケーションが登録 ID をサードパーティーのアプリケーションサーバに送信するまでは、登録は完了しません。アプリケーションサーバは、特定のデバイスで実行中のアプリケーションがターゲットとなっているメッセージを送信するために登録 ID を使用します。

C2DM からの登録解除

C2DM から登録を解除するには、以下のようにして行います。

Intent unregIntent = new Intent("com.google.android.c2dm.intent.UNREGISTER");
unregIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0));
startService(unregIntent);

登録結果のハンドリング

マニフェストの作成 で解説したように、マニフェストには com.google.android.c2dm.intent.REGISTRATION 用のレシーバーを定義します。ここには com.google.android.c2dm.intent.RECEIVE 用のレシーバーも登録します。登録とメッセージの受信の両方が インテント として実装されている点に注目してください。

REGISTRATION の主な用途は、アプリケーションが登録 ID を受信できるようにすることです。インテントはいつでも送信可能です。Google は定期的に登録 ID をリフレッシュします。registration_id パラメータ付きのこのインテント受信するアプリケーションは、サードパーティのアプリケーションサーバが登録 ID を受信すること保証する必要があります。登録 ID を保存し、それをサーバに送信することによりそのことを実現するのがいいでしょう。ネットワークが落ちていたり、エラーがある場合は、アプリケーションはネットワークが再度上がったとき、または次回の開始時に登録 ID の送信をリトライする必要があります。アプリケーションはその登録状態を管理し、処理がすべて完了していない場合は、再度登録を試みる必要があります。

登録が完了できなかった場合、REGISTRATION インテントが error パラメータ付きで生成されます。これが発生した場合、アプリケーションはべき乗再送処理を使って後から再度トライすべきです。アプリケーションが登録解除したときは、 REGISTRATION インテントが unregistered の追加パラメータ付きで送信されます。

以下は、REGISTRATION インテントに対して返される可能性のあるエラーコードです。

エラーコード 説明
SERVICE_NOT_AVAILABLE デバイスが応答を読めなかったか、後でリトライが可能な 500/503 がサーバから戻った。アプリケーションはべき乗再送処理 ( exponential back off ) を使ってリトライすべきです。
ACCOUNT_MISSING 携帯に Google アカウントがない。アプリケーションはユーザにアカウントマネージャを開き、Google アカウントを追加するよう依頼する必要があります。
AUTHENTICATION_FAILED パスワードが無効。アプリケーションはユーザにパスワードを入力するよう依頼し、後で手動でリトライしてもらう必要があります。デバイス側で修正します。
TOO_MANY_REGISTRATIONS ユーザが登録済みのアプリケーションをたくさん入れている。ユーザにその他のアプリケーションをアンインストールする必要がある旨を伝え、手動でリトライしてもらいます。デバイス側で修正します。
INVALID_SENDER センダーのアカウントが認可されていない。
PHONE_REGISTRATION_ERROR Google にはない不正な携帯登録。この携帯は現在 C2DM をサポートしていません。

アプリケーションは、アプリケーションサーバがメッセージをそれに送ろうと試みるときはいつでも REGISTRATION インテントのブロードキャストを受信します。しかし、以下のようなさばざまな理由から、登録 ID が存在しないことや無効になることがありえます。

  • アプリケーションが初めて実行したばかりだと、登録 ID がまだない状態です。
  • アプリケーションが登録解除されると、登録 ID がなくなります。
  • C2DM サーバが定期的に登録 ID をリフレッシュします。

アプリケーションは、すべてのケースをハンドルするように準備されている必要があります。以下はその例です。

public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("com.google.android.c2dm.intent.REGISTRATION")) {
handleRegistration(context, intent);
} else if (intent.getAction().equals("com.google.android.c2dm.intent.RECEIVE")) {
handleMessage(context, intent);
}
}

private void handleRegistration(Context context, Intent intent) {
String registration = intent.getStringExtra("registration_id");
if (intent.getStringExtra("error") != null) {
// 登録の失敗、後で再度トライの必要あり。
} else if (intent.getStringExtra("unregistered") != null) {
// 登録解除が完了、認証済みセンダーからの新しいメッセージは拒否される。
} else if (registration != null) {
// 登録 ID をメッセージ送信するサードパーティーのサーバに送信。
// これは分離されたスレッドで行う必要がある。
// 完了したら、すべての登録が完了したことを憶えておく。
}
}

受信データのハンドリング

C2DM サーバがサードパーティのアプリケーションサーバからメッセージを受信すると、C2DM はメッセージの本体から生のキーと値のペアを抽出し、それを com.google.android.c2dm.intent.RECEIVE インテントで追加情報のセットとして Android アプリケーションにそれを渡します。アプリケーションはデータをキーで取り出して、アプリケーションとってそれがどのような意味があろうと、その処理を行います。

以下はその例です。

protected void onReceive(Context context, Intent intent) {
String accountName = intent.getExtras().getString(Config.C2DM_ACCOUNT_EXTRA);
String message = intent.getExtras().getString(Config.C2DM_MESSAGE_EXTRA);
if (Config.C2DM_MESSAGE_SYNC.equals(message)) {
if (accountName != null) {
if (Log.isLoggable(TAG, Log.DEBUG)) {
Log.d(TAG, "Messaging request received for account " + accountName);
}

ContentResolver.requestSync(
new Account(accountName, SyncAdapter.GOOGLE_ACCOUNT_TYPE),
JumpNoteContract.AUTHORITY, new Bundle());
}
}
}

アプリケーションの開発とテスト

以下に C2DM 機能を使用する Android アプリケーションの開発とテストのためのガイドラインをいくつか挙げます。

  • C2DM アプリケーションの開発とテストには、下層にある必須の Google サービスが含まている Android 2.2 システムイメージでアプリケーションの実行とデバックを行う必要があります。
  • 実際のデバイスでの開発とデバッグには、マーケットアプリケーションが含まれている Android 2.2 システムが実行中のデバイスが必要です。
  • Android エミュレータでの開発とテストには、Android SDK と AVD マネージャを使って、SDK 内に Google API の Android 2.2 バージョンのアドオンをダウンロードする必要があります。具体的には、"Google APIs by Google Inc, Android API 8" という名前のコンポーネントをダウンロードします。その後、そのシステムイメージを使用する AVD をセットアップする必要があります。
  • C2DM の機能がアプリケーションの機能に絶対必要な場合は、必ずマニフェストで android:minSdkVersion="8" をセットしてください。これにより、アプリケーションが適切に動作しない可能性のある環境にインストールできないことを保証してくれます。

サードパーティーアプリケーションサーバの役割

C2DM 機能を使用するクライアントアプリケーションを作成する前に、以下の前提条件を満たす HTTPS のアプリケーションサーバが必要になります。

  • クライアントとの通信が可能である。
  • HTTP リクエストを C2DM サーバに送ることが可能である。
  • 必要に応じてリクエストとキューデータをハンドリング可能である。例えば、べき乗再送処理 を実行すべきです。
  • ClientLogin 認証トークンと登録 ID を保存することが可能である。ClientLogin 認証トークンはメッセージを送信する POST リクエストのヘッダに含まれています。このトピックのより詳しい解説は、ClientLogin インストール済みアプリケーションに対する ClientLogin を参照してください。サーバにはトークンを保存し、定期的にそれをリフレッシュするポリシーが必要です。

アプリケーションサーバのメッセージ送信方法

このセクションでは、サードパーティアプリケーションサーバが、モバイルデバイスで実行中のサードパーティクライアントアプリケーションにメッセージを送信する方法を説明します。

サードパーティアプリケーションサーバがアプリケーションにメッセージを送信する前に、そこから登録 ID の受信を完了しておく必要があります。

メッセージを送信するには、アプリケーションサーバが、以下の含めた POST リクエストを https://android.apis.google.com/c2dm/send に発行します。

フィールド 説明
registration_id 携帯の Android アプリケーションから取得された登録 ID 。必須。
collapse_key デバイスがオフラインのときに、クライアントに最後のメッセージだけが届けられるようにするために、メッセージといったグループをつぶす ( collapse ) 目的で使用される任意の文字列。これは携帯がオンラインに戻ったときに大量のメッセージが送信されてしまうことを回避することを意図しています。送信されるメッセージの順序は保証されていないことから、アプリケーションサーバから送信される最後のメッセージが実際には "最後の" メッセージにならないこともあるという点に注意してください。必須。
data.<key> キーと値のペアで表現された本体のデータ。存在する場合は、それがアプリケーションのデータとして <key> を使ってインテントに含まれます。キーと値のペアの数に制限はありませんが、メッセージ全体のサイズには制限があります。オプション。
delay_while_idle これが含まれていて、デバイスがアイドルの場合は、メッセージが即座に送信されるべきでないことを示します。サーバはデバイスがアクティブになるまで待機し、その後、各 collapse_key 値に対する最後のメッセージのみが送信されます。オプション。
Authorization: GoogleLogin auth=[AUTH_TOKEN] ヘッダに付加する ClientLogin 認証トークン。クッキーが ac2dm サービスに関連付いている必要があります。必須。

この表では戻される可能性のある応答コードをリストしています。

応答 説明
200

本体の内容には以下が含まれています。

  • id=[送信されたメッセージの ID]
  • Error=[エラーコード]
    • QuotaExceeded — センダーにより送信されたメッセージが多すぎる。しばらくしたらリトライします。
    • DeviceQuotaExceeded — センダーにより特定のデバイスに送信されたメッセージが多すぎる。しばらくしたらリトライします。
    • InvalidRegistrationregistration_id がないまたは不正。センダーはこのデバイスへのメッセージ送信を停止しなければなりません。
    • NotRegistered — 例えばユーザがアプリケーションをアンインストールしたり通知をオフにしたなどによるregistration_id の有効期限切れ。センダーはこのデバイスへのメッセージ送信を停止しなければなりません。
    • MessageTooBig — メッセージの本体が大きすぎる。制限事項 を参照。メッセージのサイズを減らしてください。
    • MissingCollapseKey — Collapse キーは必須。リクエストに Collapse キーを加えてください。
503 サーバが一時的に使用できないことを表します ( 例、タイムアウト、その他 ) 。センダーは、なんらかの Retry-After ヘッダをレスポンスに含めるという約束を守って後でリトライする必要があります。アプリケーションサーバはべき乗再送処理を実装すべきです。問題を起こしたセンダーはブラックリストに載る危険性があります。
401 センダーの検証に使用された ClientLogin AUTH_TOKEN が無効であることを表します。

実例集

入門編として完成した例を 2 つ挙げます。

  • JumpNote 。JumpNote は自動同期付きの双方向ノートアプリケーションのサンプルです。JumpNote は Android のクラウド to デバイスメッセージングフレームワークと同様に Android 同期フレームワークの使用方法も示しています。JumpNote は Google App Engine 上で実行していて、ウェブインターフェイスに GWT を使っています。
  • Google Chrome to Phone Extension 。ユーザは "Chrome to Phone" を使って Chrome ブラウザからモバイルデバイスにコンテンツを送信することができます。

ソースコードを参照するには、Source タブを開き Browse をクリックします。ここからソースの階層をたどって行きます。

制限事項

C2DM には以下の制限事項があります。

  • メッセージのサイズは 1024 バイトに制限されています。
  • センダーが送信するメッセージの総数とセンダーが特定のデバイスに送信するメッセージの数は、Google により制限されています。