厳しい残暑が続きますが、暦の上では秋。秋といえば、iOS 6がリリースされる時期ですよ! その折にはなにかレポートいたしますので、ご期待ください。
さて、今回は「プッシュ通知」について。Mountain Lionでは「通知センター」として語られがちだが、ここではその本質の機能であるプッシュ通知について、解説してみたい。
「通知センター」の舞台裏
Mountain Lionで追加された「通知センター」は、メールの到着やTwitterのメンションなどをリアルタイムに知らせる表示領域だ。しかし、デスクトップ右上にある通知ボタンを含め、それらは一種の"外枠"であり、通知センターの本質ではない。
通知センターの本質は「プッシュ通知の伝達」にあり、それは基本的にiOSと同様だ。通知経路は「リモート通知」と「ローカル通知」の2種類があり、前者はAppleが運営する専用サーバー(APNS、Apple Push Notification Service)経由でデータが送られ、後者は前者とほぼ同じ機能をローカルホスト上で実現する。
この通知経路の違いは、ユーザにとっては大きな差は生じない。まったく同じ外観のバナーや警告パネルで知らされるため、区別すら困難だ。しかし、リモート通知はAPNSをを経由するため、インターネットへの接続が必須なうえに若干の遅延が避けられない。一方のローカル通知はローカルホスト内で完結するため、スタンドアロンの状態でも動作し、遅延はほぼ発生しない。
なお、APNSの利用は勝手にできるものではなく、Appleの開発支援プログラム――iOSならば「iOS Dev Center」、OS Xならば「Mac Dev Center」――にアプリケーションを登録し、IDの発行を受けなければならない。ほかにも、プロバイダ(プッシュ通知専用のサーバ)に証明書ファイルを用意するなど、数段階の手順を踏む必要がある。このあたりの事情はiOSと同様でノウハウが蓄積されているため、いずれMountain Lionでも対応アプリケーションは増えるはずだ。
「通知センター」のしくみ
では、Mountain Lionの内部では、データをどのように処理しているのだろう? Mountain Lionを対象とした参考文献はほぼ無い状況だが、一般公開されているiOS向けの開発資料(Technical Note TN2265)と、稼働中のサービスがそのヒントになる。
通知センターのエンジンに相当する部分は「apsd」(/ System / Library / PrivateFrameworks / ApplePushService.framework / apsd)だ。このデーモンはLionの時点から存在するが、Mountain Lionで「applepushserviced」から「apsd」に改名されている。
apsdは、起動されると/ Library / Preferencesディレクトリにあるプロパティリスト「com.apple.apsd.plist」を参照し、TCP/5223ポートのリッスンを開始する。このプロパティリストには、アドレスブックやカレンダー、ゲームセンターなどAPNSとの通信が必要なアプリケーションの情報が登録され、プッシュ通知があり次第アプリケーションが定めた処理を行う。
プッシュ通知のYet Anotherな使い方
ここに紹介する「terminal-notifer」は、プッシュ通知のしくみを手動で試せるRubyアプリケーションだ。RubyGemsでも配布されているため、Terminalから以下のコマンドラインを実行するだけで導入できる。プッシュ通知のうちローカル通知を活用した、ユニークかつ実用的なサンプルだ。
$ sudo gem install terminal-notifier
基本的な用法は、「-message」オプションで通知するメッセージを記述し、引数にアプリケーションのIDを指定するスタイルだ。たとえば、以下のとおりコマンドラインを実行すると、「こんな感じで通知できます」と書かれたバナーが通知センターに表示される。
$ terminal-notifier -message "こんな感じで通知できます"
「-activate」オプションを利用すると、バナーをクリックしたとき他のアプリケーションを起動することも可能だ。以下のコマンドライン実行例では、カレンダー(旧iCal)のアプリケーションIDを指定しているので、クリックすると「カレンダー」が起動する。
$ terminal-notifier -message "クリックするとカレンダーを起動します" -activate com.apple.iCal
ファイルを開くこともできる。この機能は実際にはコマンドを実行するためのものだが、以下の要領でopenコマンドの引数に開きたいファイルのパスを指定すれば、クリックすると特定のファイルを開くバナーを用意できる。工夫次第ではいろいろな用途に使えそうだ。
$ terminal-notifier -message "クリックするとPDFを開きます" -execute "open ~/Desktop/ad.pdf"