2012年4月6日

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

だいぶ間が開いてしまいました。
皆さんお元気でしたか?

今回は前回のC2DMに続き、APNsをnode.jsで実装したいと思います。

こちらは証明書の発行等、相当厄介ですので、
わからなければコメント等で聞いてください。

証明書の作成

まずは、iOS Provisioning Portalで証明書の発行等の手続きをします。

下記を参考に発行いたしました。
【iPhone】Push Notificationの実装方法 | iPhoneアプリで稼げるのか

証明書の変換

次に、先程保存した、.p12ファイルを変換します。

まずFTPかscpか何かでサーバにアップロードしてください。
apns_push_projectという仮名を/var/wwwの下に作ると仮定して、
/var/www/apns_push_project/keys/
というディレクトリを作って、そこへコピーしてください。

上記の参考サイトにもありましたが、.pemファイルへ変換しますが、
node.js用に少し改変いたします。
openssl pkcs12 -clcerts -nokeys -out apns-dev-cert.pem -in apns-dev-cert.p12
openssl pkcs12 -nocerts -out apns-dev-key.pem -in apns-dev-key.p12
openssl rsa -in apns-dev-key.pem -out apns-dev-key-noenc.pem
これで、
apns_dev_key.pem

apns-dev-key-noenc.pem
が作成されます。今回はこの2つを使用します。

プログラミング

最後にnode.jsのプログラミングです。
こちらはnpmでapnモジュールをインストールしておいてください。
npm install apn

そして、サンプルコードへ移ります。
/**
 * APNs Sample Code
 *
 * @author dommy <shonan.shachu at gmail.com>
 * @version 1.0.0 updated on 2012-03-15
 */

// settings
var http   = require('http');
var server = http.createServer();

// APNs Configuration
var apns = require('apn');
var options = {
  cert    : './keys/apns-dev-cert.pem',
  key     : './keys/apns-dev-key-noenc.pem',
  gateway : 'gateway.push.apple.com',
  port    : 2195,
};

// create device object
var token = 'xxxxxxxxxx';
var myDevice = apns.Device(token);

// main function
server.on('request', function(req, res) {
  // create apns connection object
  var apnsConnection = new apns.Connection(options);
  // create notification object
  var note = new apns.Notification();

  // Notification Configuration
  note.badge = 3;                       // Number will be shown on the right top corner of App icon
  note.alert  = 'You have new message'; // Message displayed on the Notification Center
  note.device = myDevice;               // device information
  
  // send notification
  apnsConnection.sendNotification(note);

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

server.listen(80, '127.0.0.1');

サーバとかポートとかは変えてくださいね。
tokenの取得方法とかはまた解説します。

参考: argon / node-apn | GitHub