androidでプッシュ通知を実装する【第6回 Appサーバ側実装編】

この記事は2015年10月20日に書かれたものです。内容が古い可能性がありますのでご注意ください。


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回GcmIntentServiceonHandleIntentメソッドの中身見てください。
インテントからエクストラを取り出した後、エクストラから”message”という名前で文字列の値を取り出しています。
このように取り出せるようにするには、”data”:{“message”:”送信したいメッセージです”}
とすればよいということです。

collapse_keyについて。
GCMでは、端末がオフラインでメッセージを受け取れない状態にあるときGCMストレージに特定期間保持し、
端末が受信できる状態になったら送信を行ってくれます。
そのため複数のメッセージが溜まっていた場合、メッセージが一度にどさどさっと届いてしまいます。
そこでcollapse_keyを指定してグループ化すると受信可能になったとき、グループのうち
最後のメッセージだけが送信されるようにすることができます。

delay_while_idletime_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回 アプリ側実装後編】

  • このエントリーをはてなブックマークに追加

PAGE TOP