androidでプッシュ通知の実装をテーマとして第6回目。
前回でクライアントアプリ側の実装が終わったので今回はAppサーバ側の実装についてです。
プッシュ通知は
AppサーバからGCMサーバにレジストレーションIDとメッセージを送ると、GCMサーバがレジストレーションIDを元に
各端末にメッセージを送信します。(おさらい:第1回)
メッセージを送るには、GoogleのAPI https://android.googleapis.com/gcm/send へPOSTリクエストを送信します。
POSTリクエストが送れるならAppサーバの構成はなんでもいいのですが
今回はPHPを用いて説明していきます。
HTTPヘッダ
リクエストのHTTPヘッダには次のふたつが必ず含まれている必要があります。
Authorization: key=AIzaSy*************** Content-Type:application/json
key=以下に入るのは以前GoogleDevelopersConsoleで取得したAPIキーです。
また後述しますが、HTTPボディにはJSONを用いるので
Content-Typeを指定しておきます。
HTTPボディ
HTTPのボディにはJSONを用います。
(正確にはプレーンテキストも使用できますが、複数の端末への同時送信ができないので
その利用はあまり現実的ではないでしょう。)
JSONの中に含むことのできるパラメータは以下のとおりです。
registration_ids | レジストレーションIDの文字列配列。メッセージの送信先を指定します。必須です。 |
data | 送りたいデータ。キーと値のペアで表現し、キーはアプリ側ではインテントエクストラの名前になります。 |
collapse_key | メッセージをグループ化するための任意の文字列です。 |
delay_while_idle | デバイスがスリープ状態のときはメッセージを送信しないと指定できます。booleanで指定し、デフォルトではfalseです。trueの場合デバイスが操作状態になったとき送信されます。 |
time_to_live | デバイスがオフラインのときにメッセージがGCM ストレージに保持される期間です。秒指定。 指定しない場合のデフォルトは4週間です。 |
以下補足です。
registration_idsは最低で1つ含み送信先を指定する必要があります。
最大で同時に1000のidに送ることができます。
dataは少々わかりづらい言い回しになっていますが、例を追えば簡単だと思います。
第4回のGcmIntentServiceのonHandleIntentメソッドの中身見てください。
インテントからエクストラを取り出した後、エクストラから”message”という名前で文字列の値を取り出しています。
このように取り出せるようにするには、”data”:{“message”:”送信したいメッセージです”}
とすればよいということです。
collapse_keyについて。
GCMでは、端末がオフラインでメッセージを受け取れない状態にあるときGCMストレージに特定期間保持し、
端末が受信できる状態になったら送信を行ってくれます。
そのため複数のメッセージが溜まっていた場合、メッセージが一度にどさどさっと届いてしまいます。
そこでcollapse_keyを指定してグループ化すると受信可能になったとき、グループのうち
最後のメッセージだけが送信されるようにすることができます。
delay_while_idleとtime_to_liveはそのままの意味なので問題ないでしょう。
以上を踏まえたPHPのサンプルクラスが以下になります。
ClassGoogleCloudMessaging.php
<?php define('GOOGLE_API_URL','https://android.googleapis.com/gcm/send'); //DeveloperConsoleから取得したAPIキー define('GOOGLE_API_KEY','AIzaS************************************'); class ClassGoogleCloudMessaging{ //ここでは直に書いていますが本来はDB等から取り出した送信先レジストレーションIDを格納 private $registration_ids = array("id1","id2","id3"); public function sendData($message){ $data = array( 'message' => $messsage ); $header = "Content-Type:application/json"."\r\n" ."Authorization:key=".GOOGLE_API_KEY."\r\n"; $contents = array( 'data' => $data, 'registration_ids' => $this->registration_ids, 'collapse_key' => 'gcmtest' ); $options_array = array(); $options_array["http"]["method"] = "POST"; $options_array["http"]["header"] = $header; $options_array["http"]["content"] = json_encode($contents); $context = stream_context_create(); stream_context_set_option( $context, $options_array ); try{ $response = file_get_contents( GOOGLE_API_URL, false, $context ); }catch(Exception $e){ $response = $e; } return $response; } } ?>
sendDataを呼び出してやればプッシュ通知が対象のレジストレーションIDの端末に送信されます。
引数の$messageには送りたいメッセージでも入れてください。
おまけ
コードを書く前にとりあえずプッシュ通知が送れることを確認したい!というせっかちさん向け。
コマンドラインからcurlコマンドで確認できます。
curl --header "Authorization:key=AIzaS************************************" --header "Content-Type:application/json" -X POST https://android.googleapis.com/gcm/send/ -d "{"registration_ids:"["レジストレーションIDをいれる"],"data":{"message":"Hello"}}" --verbose
–verboseオプションをつけておけばリクエストやレスポンスのヘッダを確認することができます。
以上です。
おわりに
6回にわたって書いてきましたandroidアプリにおけるプッシュ通知の実装についての説明は以上です。お疲れ様でした。
開発の参考にしていただければ幸いです。
androidでプッシュ通知を実装する【第1回 概要】
androidでプッシュ通知を実装する【第2回 事前準備】
androidでプッシュ通知を実装する【第3回 アプリ側実装前編】
androidでプッシュ通知を実装する【第4回 アプリ側実装中編】
androidでプッシュ通知を実装する【第5回 アプリ側実装後編】