2012年3月14日

【Node.js】AndroidのPush通知を実装する

今回はサーバサイドの解説です。

最近のスマホにはPush通知の実装は欠かせなくなってきました。
PHPやRubyでは解説してある部分もあるのですが、
node.jsとなると、まだまだ新しい言語の為か、
解説ページが極端に少なくなります。

そんな訳で、今回はnode.jsでCloud to Device Messaging(C2DM)の実装をしたいと思います。

まずはC2DMへ登録します。
Sign Up for Android Cloud to Device Messaging

次に、Authコードの発行をします。
コンソール上で、
curl -X POST https://www.google.com/accounts/ClientLogin -d Email={GoogleアカウントのEmail} -d Passwd={Googleアカウントのパスワード} -d accountType=HOSTED_OR_GOOGLE -d service=ac2dm -d source={パッケージ名}
というコマンドを打つと、3行ほどのレスポンスがあります。
その3行目にAuth=という行がありますので、
Auth=を含めてメモしておいてください。

以上で事前準備は完了です。

ここからはプログラムを書いていきます。
node.jsのインストールですが、
以前解説したので省きます。
npmコマンドが使えるようにしておいてください。

次に、npmでc2dmモジュールのインストールを行います。
npm install c2dm
これでプロジェクトにc2dmモジュールがインストールされました。

では、簡単なサンプルを
/**
 * C2DM Sample Code
 * @author dommy <shonan.shachu at gmail.com>
 * @version 1.0.0 updated on 2012-03-14
 */
// settings
var http   = require('http');
var server = http.createServer();

// C2DM configuration and create object
var options = {
  token : 'Auth=xxxxxxxxxxxxxxxxxxxxxxxx',
};
var C2DM = require('c2dm').C2DM;
var c2dm = new C2DM(options);

// Registration ID will be received from Android App
var receiver = 'C2DM Registration ID';

// main function
server.on('request', function(req, res) {
  // create notification
  var msg = 'You have new message';    // main message
  var sender = 'dommy@shonanshachu';   // sender
  var notification = {
    regitration_id  : receiver,
    collapse_key    : '1',
    'data.msg'      : msg,
    'data.sender'   : sender,
  };
  c2dm.send(notification, function(error, messageId) {
    // error handling

    // return response
    res.writeHead(200, {'Content-Type': 'application/json'});
    res.write('{status:1}');
    res.end();
  });
};

// listen port 80
server.listen(80, '127.0.0.1');

これで、localhostを叩くと、AndroidアプリにPushが飛びます。
C2DM Registration IDはAndroidアプリから受け取ってください。
こちらの取得方法等の解説もどこかでします。
ちなみに、notification内でdata.fromを使おうとしましたが、
data.fromは予約されていて、
Authコードを発行した時に使ったGoogleアカウントのメールアドレスになります。

ちなみに、notificationのcollaple_keyの使い方がよくわかりません。
どなたか分かる方いましたら、コメントお願いします。

iPhoneのPush通知を実装する(node.js編)

参考: SpeCT / node-c2dm | GitHub