Guzzle(PHP)でAPNsの同時配信を行う

GuzzleでiOSのAPNs(Push通知)をお手軽に同時配信する方法

APNs自体についてはAPNs Provider API(http2)を利用する(Node.js)を参照

事前準備

Guzzle自体は以前の記事を参照

curlの更新

APNsを使うにはhttp2が必要かつ非同期で実行したいので、curlをインストールし直す

homebrewを使っている場合は以下の感じ

brew install curl --with-nghttp2 --with-openssl
brew link curl --force
brew reinstall php56 --with-homebrew-curl

なお、自分で試した時は上記だけではhttp2が有効にならなかったので、 アンイストールした方が確実かもしれない

更新後に

curl -V

としてhttp2が出ていればOK

Guzzleの使い方

http2で通信する

オプションで指定するだけでOK

$client = new Client(['version' => 2.0]);

POST送信

bodyはリクエスト時のオプションとして以下の感じで指定する

$client = new Client();
$response = $client->request('POST', $url, ['body' => $body]);

bodyの中身をJSONにしたい時は、

['body' => json_encode($json])]

という形にして渡す

クライアント証明書をつける

これもオプションで指定するだけでOK

例えば同じ階層内にapns_dev.pemという証明書(パスフレーズ0000)に置いた場合は、

$client = new Client(['cert' => ['apns_dev.pem', '0000']]);

あえていうなら、pem形式の証明書を作るのがちょっと面倒

APNsの同時配信

APNsは通知内容をJSONで指定することと、前回の並列リクエストを併せると、以下のコードで同時配信が実現できる

(※配信環境はSandBox向け)

開発環境