2015年1月23日金曜日

【PHP】【Android】プッシュ通知 Google Cloud Messaging に連携する Webシステム側から送信のテスト

Web上のシステムから送信し、Androidでそれを受信し、ノーティフィケーションで通知したいような場合。
いわゆるアンドロイドのプッシュ通知の機能。
Web上のシステムとAndroidとをつなぐシステムがGoogleから提供されている。

Google Cloud Messaging という。

参考:
http://www.techdoctranslator.com/android/guide/google/gcm/gs
http://www.techdoctranslator.com/android/guide/google/gcm/gcm
http://dev.classmethod.jp/smartphone/android/gcm/

Android側の実装は上記のそれぞれの記事に色々書いてあるのですが、Web側からの送信のサンプルが少ないので、自作しました。

共有します。

下記ふたつのPHPファイルを、下のソースからコピペして作成し、Webサーバーの同じディレクトリに設置して使ってください。私はXAMPP環境でテストしていました。
◆index.php
◆ClassSenderDataToGoogleCloudMessaging.php

保存文字コードはUTF-8(ボム無し)です。

ClassSenderDataToGoogleCloudMessaging.php のほうは、書き換える場所があります。
◆サーバーアプリAPIのキー:Googleのデベロッパーコンソールから取得します。上のURL参照。
◆端末の登録ID:これはAndroidの側の処理が出来てからじゃないと取得できない値なのでAndroid側の実装を先に頑張る必要があります。Google Cloud Messaging のAPIに端末がアクセスした時得られる値です。

「message」と「url」というふたつのキーの情報が送信される想定です。


///////////////////////////////////////////////////
[1]index.php
///////////////////////////////////////////////////

<?php
require_once("ClassSenderDataToGoogleCloudMessaging.php");

//処理結果通知
$notice_message = "";

//モード取得
if(isset($_REQUEST["mode"])){
    $mode = $_REQUEST["mode"];
}else{
    $mode = "default";
}//if

//送信モードなら送信クラスに処理させる
if($mode == "send"){
    $sender = new ClassSenderDataToGoogleCloudMessaging();
    $result = $sender->sendDataToApi($_REQUEST);
    $notice_message = "<p style='color:red;'>".$result."</p>";
}//if

?>


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Google Cloud Messaging for Android 送信テスト</title>
</head>

<body>
<div>
    <h1>Google Cloud Messaging for Android 送信テスト</h1>


    <!--送信先はこのスクリプト APIへの送信は受け取った後の処理で実行される-->
    <form method="POST" action="index.php">
        <fieldset>
            <p>
                <label>Message</label>
                <input type="text" size="20" name="message">
            </p>
            <p>
                <label>URL</label>
                <input type="text" size="50" name="url">
            </p>
        </fieldset>

        <input type="hidden" name="mode" value="send">
        <input type="submit" value="送信">
    </form>
</div>

<!--実行結果-->
<?php echo("$notice_message") ?>
</body>
</html>




///////////////////////////////////////////////////
[2]ClassSenderDataToGoogleCloudMessaging.php
///////////////////////////////////////////////////
<?php
/**
 * Google Cloud Messaging APIにデータを送信するクラス。
 *
 * Android連携のプッシュ通知の挙動テスト用。
 *
 */

class ClassSenderDataToGoogleCloudMessaging{
    //Google Cloud Messaging API のURL
    private $google_api_url = "https://android.googleapis.com/gcm/send";

    //APIのキー(Googleのデベロッパーコンソールで取得できる「Server API Key(サーバー アプリケーションのAPIキー)」)
    private $api_key = "ここにサーバーアプリケーションのAPIキーを記述";

    //AndroidデバイスIDの配列(まずAndroidからWebAPIに登録してもらう動作をさせ、この値を取得する必要がある)
    //「APA91bEglOye6b4CRq0aACO1ENKHm-V3sOCBgSwIvdSn_UzNioF8jlRftjgR1XSYWk0c8DfOGLcbVuBps3v-PAOsfnvkB4A3ItCDNxlPslI_5BosUNuuZtVGRiZf1Nu1yXa5sGzXuTG0OtjDGu8xcIyHqCPf1Uyi3w」みたいな長い文字列になる
    private $registration_ids = array(
         "ここに端末の登録IDを記述"
        ,"ここに端末の登録IDを記述"
    );


    ///////////////////////////////
    /**
     * APIにデータ送信
     *
     * @param array フォームの送信データ($_REQUEST)
     */
    public function sendDataToApi(
        $request
    ){

        ////////////////////////////
        //送信データ受け取り
        $send_data = $request;


        ////////////////////////////
        //ヘッダーの文字列作成
        $header_string =
             "Content-Type:application/json"."\r\n"
            ."Authorization:key=".$this->api_key."\r\n";


        ////////////////////////////
        //APIへの送信コンテント作成

        //送信コンテント JSON形式
        //参考 : http://dev.classmethod.jp/smartphone/android-tips-14-gcm/
        /*
         * [送信データ]
         * data             : 送りたい文字列(JSON形式で複数可能) ※ 4KBまで
         * registration_ids : 端末ごとの登録IDのリスト(JSON形式) ※一度に1~1000のidを登録可能 ※必須
         * collapse_key     : 送信するメッセージのグループ(任意の文字列)
         * time_to_live     : デバイスがオフラインの場合にメッセージを保持しておく期間(秒で指定)
         */
        $content_array = array(
             'data'             => $send_data
            ,'registration_ids' => $this->registration_ids
            ,'collapse_key'     => 'google_cloud_messaging_test'
           
        );
        //【重要】JSON形式に変換
        $content_json = json_encode($content_array);

        ////////////////////////////
        //コンテキストインスタンスにセットするオプションの配列を作成
        //options は、 $arr['wrapper']['option'] = $value のような形式の、連想配列の連想配列である必要がある
        //参照 : http://jp2.php.net/manual/ja/context.http.php

        $options_array = array();
        //送信メソッド
        $options_array["http"]["method"]  = "POST";
        //ヘッダー
        $options_array["http"]["header"]  = $header_string;
        //コンテント
        $options_array["http"]["content"] = $content_json;


        ////////////////////////////
        //コンテキストインスタンスを作成
        $context = stream_context_create();
        //コンテキストにオプション情報(ヘッダー情報、コンテントの内容、送信メソッドなど)をセット
        stream_context_set_option(
            $context,
            $options_array
        );

        try{
            //APIへのクエリ送信、戻ってきたデータの受取
            $return_data = file_get_contents(
                $this->google_api_url, //接続先のURL
                false,                 //パス検索
                $context               //送信する内容(リソースコンテクスト)
            );

        }catch(Exception $e){
            $return_data = "エラー : APIからのデータ取得に失敗しました。<br>\n".$e;

        }//try

        //データを戻す
        return $return_data;
    }//function

}//class


0 件のコメント:

コメントを投稿