先日プッシュサーバであるGaurunを使ったプッシュサーバの作り方を紹介しました。
https://lineocean.com/2017/04/14/82/
それを踏まえまして、今日はGaurunにリクエストを送信するAPIを用意してみましょう。Gaurun自体をどこぞのドメイン配下に配置し、アプリから直接リクエストを送るという方法もありますが、セキュリティの関係などで、プッシュのリクエストを送信するAPIまたはバッチなんかを使うのが現実的ではないでしょうか。アプリからアプリへの1対1のプッシュなどではGaurunへのリクエストをラップするAPIがあれば済みそうですが、1対多数へのプッシュや、プッシュ配信レコードをDBで管理し、サーバサイドからまとめてバッチ処理するようなシステムの場合はやはりスクリプトを定期実行して送信してあげるのがみんなにやさしい運用なのかなと思います。
以下はデバイストークン含め配信先のデータをDBで保持している前提での流れです。
デバイストークン、デバイスタイプ、バッチ数を保持したオプジェクトと送信対象のメッセージからリクエスト用のbodyを作成します
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 35 36 37 38 39 40 41 42 43 44 45 46 |
$message = "送信するテキスト"; pushDataList = array(); // 配信対象のリストをこんな感じでループさせて、Gaurunに渡すデータ配列を用意します。 // deviceObjectsには最低限デバイストークンと、デバイスタイプ(iosなのかandroidなのか)、バッチ数を保持しているものとします。 foreach(deviceObjects as deviceObject) { $messageData = $this->getTargetMessageData($message, $deviceObject); // 配信データリストに登録 array_push($pushDataList, $messageData); } function getTargetMessageData($message, $deviceObject){ $deviceToken = $deviceObject->get("token"); $deviceType = $deviceObject->get("type"); $badge = $deviceObject->get("badge"); if($deviceType == "ios") { $deviceTypeNum = 1; } else if ($deviceType == "android") { $deviceTypeNum = 2; } else { $deviceTypeNum = 0; } $dataBody = array(); $dataBody['token'] = [$deviceToken]; $dataBody['platform'] = $deviceTypeNum; $dataBody['message'] = $message; if($deviceTypeNum == 1) { //ios $dataBody['badge'] = $badge++; $dataBody['sound'] = 'default'; $dataBody['content_available'] = false; $dataBody['expiry'] = 0; } else if ($deviceTypeNum == 2) { // android // 特に指定しない } return $dataBody; } |
Gaurunに対してリクエストを実行
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 35 36 37 38 39 40 |
// 適当な件数のpushDataListを渡します $this->sendPushList($pushDataList); // 送信したら一度リストを削除してもよいでしょう $pushDataList = array(); function sendPushList($pushDataList){ $data = array(); $data["notifications"] = $pushDataList; $pushDataJson = json_encode($data); // Gaurunのパス。この場合はlocalhostにいる設定です $curl = curl_init("http://localhost:1056/push"); // set curl_setopt($curl,CURLOPT_POSTFIELDS, $pushDataJson); // option $options = array( //HEADER CURLOPT_HTTPHEADER => array( 'Accept: application/json', 'Content-Type: application/json' ), ); //set options curl_setopt_array($curl, $options); // 実行 $result = curl_exec($curl); // 必要に応じてエラーハンドリングします if($result) { print("success"); } else { print("error"); } } |
もしここでエラーが吐かれていたらGaurunのインスタンスが死んでいる可能性が高いので、管理者にメールをを飛ばすなりエラーをキャッチできる処理を入れると良い感じだと思います。