*

【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;
}

?>

関連記事

no image

【google apis】GoogleのアカウントでAOuthを行う

GoogleのAOuthを使う方法です。 サマリー 目次 サイトのURL、リダイレクトする

記事を読む

no image

【google apis】GCM の使い方1 ~Getting Start~

この記事はGCMのGetting Startの要約です。 参考URL ・はじめに G

記事を読む

no image

【google apis】Zend_GdataでYouTube認証を行う

YouTube Data Apiでユーザーのプレイリストにアクセスする場合、ユーザーにアプリケー

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

no image
知らないと損をする6つのライセンスまとめ

オープンソースやフリーウェア、フリー素材などが巷に溢れ、それらを利用す

no image
ガリレオ:ニュースブラウザをリリースしました。

概要 ガリレオはニュースを読んだり、検索する機能に特化したブラウザア

no image
【android】Activityとプロセスのライフサイクル

またもやライフサイクル周りでハマったのですが、Androidのライフサ

→もっと見る

PAGE TOP ↑