HTTPでiOSのpush通知を送れる未来がやってきた(APNS::Agentの紹介)
tl;dr
% cpanm APNS::Agent
% apns-agent --certificate=path/to/cert.cer --private-key=path/to/cer.key
Twiggy: Accepting connections at http://0.0.0.0:4905/
% curl http://127.0.0.1:4905 -d 'token=1111111111111111111111111111111111111111111111111111111111111111&alert=test%20message'
Got it!
本題
APNS::Agentってのを作りました、内部的にAnyEvent::APNSを使っていてiOSのpush通知をHTTPで実現できます。
% cpanm APNS::Server
すれば、apns-agent
っていうコマンドラインサーバーがインストールされるので、そいつで起動するのが簡単です。
よく言われることですが、APNSは以下のような特徴があります。
- 独自プロトコル
- バイナリプロトコル
- 接続は使いまわさないとSPAM扱いされてしまう
- 勝手に接続を切られることがある
中継サーバー的なものを立ててそいつに接続管理してもらうのが常套手段ですが、APNS::Agentはその面倒を見てくれつつ、HTTPを受け付けるので、簡単にiOSのpush通知を送信できます。
やってることはAnyEvent::APNSでiPhoneのプッシュ通知を実装しようとほとんど同じです。HTTPなので多少オーバーヘッドがあるかもしれませんが、カジュアルにpush通知送れるんで1つ。
Twiggy使えるのでServer::Starter対応がそのままできるのが魅力です。とは言っても、今は内部的に持ってるキューが捌けるまでshutdownしないとかそういう優雅な実装になってないのでその辺はpatches welcomeです。
ちなむと、最近はAnyEvent::APNSも拡張形式でメッセージを送っているので、on_error_response
コールバックを指定することで、メッセージ失敗のエラーを読む取ることができたりします。
実装上まだ粗い部分もあると思うので、ぜひ使ってみてFB下さい。
REST厨的にはPUTリクエスト送って202返すのが正しいのかなとか迷ったけど、カッとなってPOSTで200にした。
こちらからは以上です。