Profile

横浜@神奈川県在住。法人の看板しょったSEとして働いています。

大学卒業後2年半SEやった後会社飛び出しました。

現在はWebアプリ(on GAE)とAndroidアプリの開発といったGoogleに嫌われたら終了な仕事やってます。

gcm-logo簡単に言うとGoogleが提供する対Android向けプッシュ通知サービスです。
http://developer.android.com/google/gcm/index.html

今回私はGAE(Google App Engine for Java)サーバで使用してみました。
検索してみると結構PHPとかGAE以外でやっている方が多かったのでメモしておきます。


■実装の手順
流れとしては
1.プロジェクトを用意する
2.API(Google Cloud Messaging)をONにする
3.API Keyを取得(メモ)する
4.Androidアプリにjarの組込やプログラムをセッティングする
5.サーバ(GAE)にPushする機能をプログラムする。

GAEではないですが、全体の流れとしてはこちらが参考になります。
今回は他サイトとの差分ではないですが、5番のGAEの部分だけ取り上げます。


■ライブラリの取得
実はGAE上で簡単にGCMを使うためにライブラリが用意されています。
ゼロベースで作っても良いかもしれませんが、あるものは使いましょう。

Android SDK ManagerでGoogle Cloud Messaging for Androidを取得していない場合はExtrasから取得して下さい。
取得すると
[Android SDKパス]\extras\google\gcm\gcm-server\dist\
にgcm-server.jarが入っているのでGAEプロジェクトのWEB-INF/libとかに追加。

次にWEB-INF/libにjson_simple-x.x.jarが無い場合は
[Android SDKパス]\extras\google\gcm\gcm-server\lib\
のjson_simple-x.x.jarを同様に追加して下さい。

gcm-server.jarはただのライブラリ、json_simple-x.x.jarは追加しないと
java.lang.NoClassDefFoundError: org/json/simple/parser/ParseException
が発生するので、それ対策です。


■ライブラリの改変
んで、後はプログラムだけと言いたいところなんですがごめんなさい。
最新版はどうか分かりませんが、2013/02の時点ではgcm-server.jarに問題があって
一部改変しないと日本語を通知した場合文字化けが起こります。

ということで改変しましょう。
gcm-server.jarを展開してSender.javaというクラスを開きます。
改変するのはその中のpostメソッド

byte[] bytes = body.getBytes();

という処理ですが、
私の場合は484行目にありました。こいつを

byte[] bytes = body.getBytes("utf-8");

としてやります。
それが出来たら改変は終わりなのでjarに戻してあげましょう。
(WEB-INF/libに設定も忘れずに)


■Push通知のプログラミング!
後はPush通知のプログラムだけです。

Sender sender = new Sender(gcmApiKey);
Message.Builder builder = new Message.Builder();
builder.collapseKey(collapse_key);
builder.timeToLive(time_to_live);
builder.addData("message", data);
Message message = builder.build();
try {
    MulticastResult result = sender.send(message, registrationIds, 5);
} catch (IOException e) {
    e.printStackTrace();
}

gcmApiKeyはGCMで取得したAPIKey
collapse_keyは通知グループ名(String) いくつか送った時に同じ通知グループ名は一つにまとめられるようです
time_to_liveは通知メッセージが送れない時にどのくらいの時間(intで秒指定)キープするか
dataは通知するメッセージ(String)
registrationIdsはregistrationIdのString型のListです。

なので、上記を実装して、registrationIdはアプリとかで事前に取得してDB化しておき、
必要に応じて通知したい端末のregistrationId向けに上記処理を行うという感じになるかと思います。

registrationIdってどうやって取得するの?っていうのは前述のこちらが参考になります
Activityの実装で説明されています。


コメントを残す

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>