【google apis】GCM の使い方2 ~GCM Architectural Overview~
公開日:
:
google apis
前回に引き続きGCMの使い方です。
前回:【google apis】GCM の使い方1 ~Getting Start~
クライアント側はGetting Startで事足りそうなので、今回はArchitectural Overviewのサーバーサイドのパートのみ扱っていきます。
サードパーティサーバーアプリ
・複数の端末にも同時にメッセージを送れる。
・複数の端末に送る場合はJSONを使用する。
・メッセージを送る前にクライアントアプリからregistration IDを受け取る必要がある。
手順
1.クライアント端末のregister IDを登録。
2.register IDを指定してGCMにメッセージをリクエスト。
3.状況に応じてregister IDを削除。
→ ユーザーが通知を受け取らない設定に変えた。なんらかの原因で同じ端末のregister IDを重複登録していた。など。
よってAPIは3つ必要となります。
リクエストフォーマット
●URL(POST)
https://android.googleapis.com/gcm/send
●ヘッダー
・ Authorization: key=YOUR_API_KEY
・ Content-Type: application/json (JSONの場合)
・ Content-Type: application/x-www-form-urlencoded;charset=UTF-8 (テキストの場合)
例)
Content-Type:application/json Authorization:key=AIzaSyB-1uEai2WiUapxCs2Q0GZYzPu7Udno5aA { "registration_ids" : ["APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx..."], "data" : { ... }, }
●ボディ(JSON)
・registration_ids 必須
クライアント端末のregistration IDの文字列配列。
要素数の制限は1から1000まで。
型:string array
・collapse_key 省略可
端末オフラインなどが原因で送信されなかったメッセージに使用される文字列で、複数のメッセージがあった場合、”最後のメッセージ”のみクライアントに送信される。
これはオンライン復帰時に大量のメッセージを受信するのを避けることを意図している。
この場合、送信順は保証されず、”最後のメッセージ”は必ずしもサーバーが最後に送信したメッセージとは限らない。
型:string
・data 省略可
ペイロードデータ。キーとバリューのJSONデータ。最大4kB。
例:”data”:{“score”:”3×1″}
型:JSONオブジェクトでもよいが、GCMサーバで文字列に変換されるので、文字列データの使用を推奨。
キーとして予約後は使用不可(”from”または”google*”)
HTTPボディのキーとなる文字列は使用しないことを推奨。
・delay_while_idle 省略可
クライアント端末がidle状態の場合はメッセージを送信せずに、activeになってから送信する。
activeになるまではcollapse_keyの値が送信される。
デフォルトはfalse。
型:JSON boolean
・time_to_live 省略可
クライアント端末がオフラインであった場合に、いつまでメッセージを保持するか。
秒単位で指定。
デフォルトは4週間。
型:JSON number
・restricted_package_name 省略可
クライアントアプリのパッケージ名。
指定した場合、パッケージ名がマッチしたregistrationIDsにのみメッセージを送信する。
・dry_run 省略可
指定した場合、実際のメッセージは送信されず、リクエストのテストを行うことができる。
デフォルトはfalse。
型:JSON boolean
リクエスト例:
{ "registration_ids": [ "42" ] }
{ "collapse_key": "score_update", "time_to_live": 108, "delay_while_idle": true, "data": { "score": "4x8", "time": "15:16.2342" }, "registration_ids":["4", "8", "15", "16", "23", "42"] }
レスポンスフォーマット
HTTPレスポンスコード
HTTPのレスポンスコードは通常どおりであるが、リクエストで送信したJSONの中に、不適切な型の値が含まれると400で返ってくる。
例えば
’time_to_live’ : ‘300’
‘delay_while_idle’ : 10
とした場合など。
GCMのレスポンス
レスポンスはJSON形式
・multicast_id
送信したメッセージのID
・success
送信に成功したメッセージ数
・failure
送信に失敗したメッセージ数
・canonical_ids
重複したregistration IDの数。
・results
メッセージの処理状況を表す配列オブジェクト。
並び順は送信時のregistrattionIDに対して同様となる。
それぞれは下記のフィールドを持つ。
- 処理が成功したことを表す文字列。
- もし値があれば、canonical registration IDが存在したことを意味する。
canonical registration IDは重複登録されたregistration IDを意味する。なんらかの理由で同じ端末が重複して登録されているため、片方を削除する必要がある。
- error エラーを表す文字列が入る。エラー一覧
レスポンス例:
{ "multicast_id": 216, "success": 3, "failure": 3, "canonical_ids": 1, "results": [ { "message_id": "1:0408" }, { "error": "Unavailable" }, { "error": "InvalidRegistration" }, { "message_id": "1:1516" }, { "message_id": "1:2342", "registration_id": "32" }, { "error": "NotRegistered"} ] }
サンプル
<?php define('API_KEY', 'replace your api key'); define('GOOGLE_URL', 'https://android.googleapis.com/gcm/send'); $dry_run = false; //true:実際にはメッセージを送信しない。開発時のテスト用。 $time_to_live = 60 * 60 * 24 * 28; //4 weeeks $delay_while_idle = false; //端末がidle時はactiveになるまで送信を待つ $collapse_key = "update"; //オンライン復活時に表示する文字列 //regId配列の作成 $regId = "replace registered regId"; $ids = array( $regId, 'dummy id xxxxx'); //ペイロード $payload = array( 'msg1' => 'hello', 'msg2' => 'bonjure', 'msg3' => 'konnichiwa' ); $data = array( 'collapse_key' => $collapse_key, 'time_to_live' => $time_to_live, 'delay_while_idle' => $delay_while_idle, 'registration_ids' => $ids, 'dry_run' => $dry_run, 'data' => $payload ); $content = http_build_query($data); $content = json_encode($data); $options = array( 'http' => array( 'method' => 'POST', 'header' => array( "Content-Type: application/json", "Authorization: key=".API_KEY, "Content-Length: ".strlen($content), ), 'content' => $content ) ); $response = file_get_contents( GOOGLE_URL, false, stream_context_create($options)); //レスポンス $res = json_decode($response); print_r($res); echo "<br /><br />"; echo "multicast_id:".$res->multicast_id."<br />"; echo "success num:".$res->success."<br />"; echo "failure num:".$res->failure."<br />"; echo "canonical_ids num:".$res->canonical_ids."<br />"; echo "<br /><br />"; $results = $res->results; echo "<br /><br />"; print_r($results); for ( $i = 0; $i < count($results); ++$i){ echo "rec:".$i." : ".$results[$i]->message_id." : ".$results[$i]->registration_id." : ".$results[$i]->error; } ?>
関連記事
-
-
【google apis】Zend_GdataでYouTube認証を行う
YouTube Data Apiでユーザーのプレイリストにアクセスする場合、ユーザーにアプリケー
-
-
【google apis】GCM の使い方1 ~Getting Start~
この記事はGCMのGetting Startの要約です。 参考URL ・はじめに G
-
-
【google apis】GoogleのアカウントでAOuthを行う
GoogleのAOuthを使う方法です。 サマリー 目次 サイトのURL、リダイレクトする