APNs Provider API(http2)を利用する(Node.js)

iOSのAPNsをAPI経由で使う方法。サーバサイドはNode.jsを利用

APNs Provider API

利用するために必要なのは、

となる

なお、http2対応が必要なのは送信のみなので、サーバ自体はhttp2対応にしなくてもOK

従来のソケット通信経由でAPNsを送信するのと比較すると、

というのが大きなメリット

特に以前は、環境の異なるトークンを送信すると、いきなりソケットの接続自体が切断される・・・ みたいな挙動があって確実に全件送信させるのは結構大変だったけど、API方式ではそういったのはない

パフォーマンス的にどうなのかは不明

送信形式

環境毎のAppleのサーバへPOSTリクエストを送ることでPush通知が送信される
指定する内容自体は従来のものと同じなので、詳細な内容は公式を参照のこと

アドレス

ヘッダ

ボディ

JSON形式の通知ペイロード

レスポンス

送信の受付に成功した場合はステータスコードが200で返ってくる

失敗した場合は、それ以外のステータスコードと、コードに応じてより詳細なエラー内容がボディで返ってくる

環境構築

もしかすると、OpenSSLは最新に上げておいた方がいいかも知れない

Node.jsは現時点(6.3.1)ではhttp2には対応していないので、 http2というモジュールをインストールしておく

証明書

証明書の準備方法は、以前のPerfect APNs編と同じ。 ただし、今回はMacに直接インストールしたNode.jsを使うので、CAルート証明書は不要

実装

クライアント証明書の指定

22,23行目にあるように、クライアント証明書と鍵を読み込んで指定する (もちろん各ファイルを同じフォルダ内に置いておくのを忘れないように)

もし、証明書の秘密鍵のパスフレーズを設定している時は、25行目のように設定が必要

(8/24 追記) 証明書の中が送信対象アプリ単独のもの(他の証明書や鍵を含んでいない)であれば、 apns-topicは指定しなくても送信可能
通常の手順で生成した場合は単独のはずなので、指定は不要。

(11/20 追記) 開発環境では上記の通りだが、本番環境では指定がないとエラーが発生する為、必須の様子

通知内容の設定

送信形式の項目で述べたように、ヘッダにバンドルIDを設定(10−12,21行目)する

デバイストークンは、URLの一部として設定する(20行目)

通知ペイロードは、44行目にあるようにボディとして書き出す

参考リンク

開発環境