APNs Provider API(http2)を利用する(Node.js)
Aug 11, 2016 · ios · serverapnshttp2
iOSのAPNsをAPI経由で使う方法。サーバサイドはNode.js
を利用
APNs Provider API
利用するために必要なのは、
- http2のPOST送信
- クライアント認証用の証明書
- CAルート証明書(必要な場合のみ)
となる
なお、http2
対応が必要なのは送信のみなので、サーバ自体はhttp2対応にしなくてもOK
従来のソケット通信経由でAPNsを送信するのと比較すると、
- 実装が簡単
- 1つのデバイストークン毎に結果が取得できる
というのが大きなメリット
特に以前は、環境の異なるトークンを送信すると、いきなりソケットの接続自体が切断される・・・ みたいな挙動があって確実に全件送信させるのは結構大変だったけど、API方式ではそういったのはない
パフォーマンス的にどうなのかは不明
送信形式
環境毎のAppleのサーバへPOSTリクエストを送ることでPush通知が送信される
指定する内容自体は従来のものと同じなので、詳細な内容は公式を参照のこと
アドレス
- 開発 :
https://api.development.push.apple.com/3/device/<デバイストークン>
- 商用 :
https://api.push.apple.com/3/device/<デバイストークン>
ヘッダ
apns-topic
: 送信対象のアプリのバンドルIDapns-id
: 通知ID。指定しなければAPNs側で自動生成apns-expiration
: 通知が無効になり破棄できるようになる有効期限apns-priority
: 優先度
ボディ
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行目にあるようにボディとして書き出す
参考リンク
- 公式:APNs Provider API
- 公式:日本語ドキュメント
開発環境
- OS X 10.12 Beta
- Node.js 6.3.1
- OpenSSL 1.0.2