Appengineなら"Channel API"てのもPush通知に使えるみたいだけど、またこんど。
C2DM使うにはまず登録が必要
http://code.google.com/intl/ja/android/c2dm/signup.html
適当にフォームに入力して、少し待つ"AC2DM invitation"という件名のメールがきた。
"Please note that by default, all new sender accounts are held to a development-only quota.
This quota is sufficient for development and exploratory purposes."
ということで、今回登録されたのは開発のみに利用できるということだが特に問題ない。
ちなみに商用サービスで使うには、なにやら利用規模を見積もってメールでやりとりしないといけないみたいです。
"Before you launch a C2DM-enabled application to a large audience,
please reply to this email to discuss a production-level quota,
including estimates on the number of devices and average messages per device."
jumpnote、およびchrometophoneというアプリのソースが公開されていて参考になるみたい
http://code.google.com/p/jumpnote/
http://code.google.com/p/chrometophone/
アプリですが、chrometophoneを参考にすることとして
ここにあった
http://code.google.com/p/chrometophone/source/browse/trunk/android/c2dm/com/google/android/c2dm/
C2DMBaseReceiver.java
C2DMBroadcastReceiver.java
C2DMessaging.java
を利用します。
C2DMBaseReceiverを継承した、C2DMReceiverを作成。
こんな感じ。
public class C2DMReceiver extends C2DMBaseReceiver { public C2DMReceiver() { super(PushMessage.SENDER_ID); } // 登録時の処理 @Override public void onRegistered( Context context, String registration_id) { Log.i("C2DMReceiver#onRegistered", registration_id); } // 登録解除時の処理 @Override public void onUnregistered(Context context) { Log.i("C2DMReceiver#onUnregistered","onUnregistered"); } // エラー時の処理 @Override public void onError(Context context, String errorId) { Log.i("C2DMReceiver#onError", errorId); } // サーバーからメッセージを受け取ったときの処理 @Override public void onMessage(Context context, Intent intent) { Log.i("C2DMReceiver#onMessage","onMessage"); Bundle extras = intent.getExtras(); if (extras != null) { String data1 = (String) extras.get("data1"); String data2 = (String) extras.get("data2"); Log.i("data1",data1); Log.i("data2",data2); } } }
こんな感じの画面を表示するActivityを作成してそれぞれのボタンは以下のような実装。
SENDER_IDはC2DMに登録したものを指定。
Button register = (Button) findViewById(R.id.register); register.setOnClickListener(new OnClickListener(){ @Override public void onClick(View view) { // C2DMサーバーへ登録リクエスト C2DMessaging.register(PushMessage.this, SENDER_ID); } }); Button unregister = (Button) findViewById(R.id.unregister); unregister.setOnClickListener(new OnClickListener(){ @Override public void onClick(View view) { // C2DMサーバーへ解除リクエスト C2DMessaging.unregister(PushMessage.this); } });
つぎにAndroidManifest.xmlにパーミッションやサービスの設定を記述。
これもchrometophoneのものを参考にして自分の環境にあわせて適当に。
XMLがうまくここに書けなかった。。
http://code.google.com/p/chrometophone/source/browse/trunk/android/AndroidManifest.xml
今回apkはエミュレータにインストール。
エミュレータ上でGoogleアカウントにサインインしてないとregistration_idの取得ができなかったので
サインインをした。
さて動作確認ですが、サーバ側の実装はしていないのでcurlをつかってメッセージ送信してみます。
最初にAuth tokenを取得しなくてはいけないようです。
curl https://www.google.com/accounts/ClientLogin \ --data-urlencode Email=***sender account email*** \ --data-urlencode Passwd=***password*** \ -d accountType=GOOGLE \ -d source=Google-cURL-Example \ -d service=ac2dmEmail,Passwdはsenderとして登録したアカウントのもので置き換え実行すると以下のような値が取得できた。
SID=xxxxxxxxxxxxxxxx
LSID=xxxxxxxxxxxxxxxx
Auth=xxxxxxxxxxxxxxxx
このAuthをつかってメッセージ送信する。
curl --header "Authorization: GoogleLogin auth=*** auth token***" "https://android.apis.google.com/c2dm/send" \ -d registration_id=*** id **** \ -d data.data1=HelloPush \ -d data.data2=HelloPush123 \ -d collapse_key=something -kregistration_idはアプリで登録ボタン押下したときに取得したログに表示されたものを利用。
こんな感じで実行したら、メッセージ届きました。
パラメータの詳細とかはここ。
http://code.google.com/intl/ja/android/c2dm/index.html#push
C2MDをとりあえず使えたということで、ここまで。