スマホアプリへのプッシュ配信システムって色々ありますよね。よくあるのはSDKをアプリに組み込んで、Web上のダッシュボードからプッシュを一斉配信とかはよくみかける仕組みです。Googleの提供するFirebaseとかを使えば比較的簡単にプッシュ送信ができるようですが、iOS/Android両方のアプリを運用していたりしてSDKを入れ直すことができない状況とかもあると思います。そういうときはメルカリの提供するOSSのGaurun(ガウルンと読む?)を使うと、比較的簡単にプッシュサーバを構築することができるのでおすすめです。
Contents
Gaurunとは
Gaurun is a general push notification server written in Golang. It proxies push requests to APNs and GCM/FCM and asynchronously executes them via HTTP/2.
https://github.com/mercari/gaurun
こうあるように、AppleのプッシュシステムであるAPNsとGoogleのプッシュシステムであるGCM/FCMに対して非同期でプッシュ送信を行うことのできるプロダクトです。Goで書かれているようです。自前でバッチ作ってもここまでのパフォーマンスを出すことは難しいと思うので、こういうときは優れたプロダクトにお世話になるのがセオリーですね。
インストール手順
基本的にはインストールしてmakeすれば使えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
#最新版のgoをダウンロード wget https://storage.googleapis.com/golang/go1.7.3.linux-amd64.tar.gz #以下に配置 sudo tar -C /usr/local -xzf go1.7.3.linux-amd64.tar.gz #環境変数を設定する export GOPATH=$HOME/go export GOROOT=/usr/local/go export PATH=$PATH:/usr/local/go/bin:$GOROOT/bin:$GOPATH/bin mkdir $HOME/go #バージョンの確認 go version go version go1.7.3 linux/amd64 #gunranのインストール:https://github.com/mercari/gaurun go get -u github.com/mercari/gaurun/... #glideのインストール go get -u github.com/Masterminds/glide #ソースディレクトリに移動 /home/username/go/src/github.com/mercari/gaurun #ここでmake make bundle make |
iOS用のpemファイルを配置します
KEYファイルとCSRファイルが必要です。このあたりの証明書ファイルの作成方法はかなり厄介なので割愛します。必要な方は下記ページなどを参照して作ってみてください。
http://d.hatena.ne.jp/samril/20130902/1378198909
1 2 3 4 5 6 |
$ pwd /home/username/APNS $ ls -lrt 合計 12 -rw-r--r-- 1 username username 4365 4月 13 17:09 2017 key_aps.pem -rw-r--r-- 1 username username 2151 4月 13 17:09 2017 cert_aps.pem |
設定ファイルの編集
基本的にデフォルト設定で問題ないと思いますが、Androidのapikeyには、googleから取得したkeyを設定します。
またiOSのtopicにはアプリで使っているbundleIdを設定すれば問題なさそうです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
$ pwd /home/username/go/src/github.com/mercari/gaurun/conf $ cat conf/gaurun.toml [core] port = "1056" #port = "unix:/tmp/gaurun.sock" workers = 8 queues = 8192 notification_max = 100 [android] apikey = "YOUR_API_KEY" enabled = true timeout = 5 # sec keepalive_timeout = 30 keepalive_conns = 4 retry_max = 1 [ios] pem_cert_path = "/home/username/APNS/cert_aps.pem" pem_key_path = "/home/username/APNS/key_aps.pem" sandbox = true enabled = true timeout = 5 keepalive_timeout = 30 keepalive_conns = 6 retry_max = 1 topic = "jp.yourdomainname" [log] access_log = "/var/log/gaurun/access.log" error_log = "/var/log/gaurun/error.log" level = "error" |
起動方法
こういう感じに使います。
1 |
bin/gaurun -c conf/gaurun.toml |
通常バックグラウンド実行することのが多そうですね。
1 |
bin/gaurun -c conf/gaurun.toml& |
プッシュ配信の方法
curlから実行できます。localhostの1056ポート(デフォルト)に対して以下のフォーマットでリクエストするとプッシュが飛びます。なおtokenには配信対象のデバイストークンが必要です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
curl -X POST \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{"notifications" : [ { "token" : ["YOUR_DEVICE_TOKEN"], "platform" : 1, "message" : "PUSH TEST!!!!", "badge" : 1, "sound" : "default", "content_available" : false, "expiry" : 10 } ] }' \ http://localhost:1056/push |
詳しい仕様はgithubに書いてあるので参照してください。
https://github.com/mercari/gaurun/blob/master/SPEC.md#post-push
プッシュのエラーが起こったら
まず一発でうまくいくことなんでそうそうないので、うまくいかなかったらログをみましょう。エラーコードをみれば大体の問題は解決できるはず。Appleのページにまとまっています。Androidの方も適宜調べればわかるはず。
https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingwithAPNs.html
実際の使い方の例
私の場合一斉配信というよりかは、アプリユーザ間のプッシュ処理を行うのにバッチと連携させて使っています。定期実行するバッチからプッシュ配信を管理するレコードを呼び出し、配信対象のデバイストークンを取得、gaurunに対してリクエストを送るようにしています。非常に高速に動作するので快適ですね。
ApnsPHPとかと比較するとバッチ実行しても非同期で処理されるので使い勝手がよいと思います。こういう優れたプロダクトを開発してくれるエンジニアに感謝の念が絶えません!やっぱメルカリすごい。
2件のコメント