APNs Provider API (HTTP/2 ) を go (1.6) から扱う

APNs Provider API で http/2 を喋るサーバが提供されるようになった。

前のやつみたいに tls でつないで指定された通りに bytes 列を作るということもなくそのまま json を送れば良い。json 以外に必要であったオプション例えば, priority 等は header で指定し、デバイストークンは /3/device/$device_token このようにパスで指定する。

あと topic というのが増えたり、無効な token を送るなどしてエラーとなった場合に切断されることがなくなったり、証明書が sandbox/production どちらにも使えるようになったなどがある。

ところで go1.6 からは http/2 を扱えるようになるかつ、よしなに使えるので net/http だけでほぼ扱える。

それを簡単にラップするのを書いた。

github.com

token := "..."
client := apnsapi.NewClient(apnsapi.ProductionServer, &http.Client{...})
header := &apnsapi.Header{ApnsTopic: "..."}
payload := `{ "aps" : { "alert" : "hi" } }`
if _, err = client.Do(token, header, []byte{payload}); err != nil {
    ...
}

こういう感じで扱う。人によって http.Client のパラメータとかは違ったり、payload をどのケースにもよしなに対応するのは手間なのでそこには手を出していない。

dockerhub にも go/1.6 が来てたのでそれで build できるかを wercker で確認もしている。

コネクションの使い回しとかもやってくれてるみたいなので、自前の apns server 書いたり、go のアプリからだったらそのまま http client を使いまわすのも良いかもしれない。

ちなみに GODEBUG という環境変数h2debug=1 が含まれてる場合 http/2 関係のログが吐かれる。

go1.6beta1 は https://golang.org/dl/#unstable こちらから試せます。