GPS位置情報取得URLの出力
前回の最後にメール送信したURL(http://[ドメイン名]/gps.php?hash={ハッシュ値}&guid=ON")にアクセスするところからの説明になります(hash、guid=ONについては後ろの項で説明します)。
この画面にアクセスした際にGPS位置情報取得URLをNet_UserAgent_Mobile_GPSを利用して出力します。Net_UserAgent_Mobile_GPSを利用してのGPS位置情報取得URL出力は次のようになります。
$gps = Net_UserAgent_Mobile_GPS::factory(); // リンク名 $link = '位置情報送信'; // GPS位置情報取得後の遷移先 $url = "http://[ドメイン名]/confirm.php"; if(preg_match("/^DoCoMo/",$_SERVER["HTTP_USER_AGENT"])){ $url .= "?guid=ON"; } $glink = $gps->getGPSLink($url, $str); # 略 // 位置情報取得URLを出力 echo $glink['tag'];
上記スクリプトで出力されたリンクをクリックすると、各キャリアのGPS位置情報取得サーバを経てGPS位置情報取得後の遷移先として指定したURLに遷移します。
NTTドコモの場合のみiモードID取得用のパラメータ「?guid=ON」をつけている件については後述します。
緯度経度の取得
前項のスクリプトで指定したGPS位置情報取得後の遷移先のphp内に以下のコードを記述することで、Net_UserAgent_Mobile_GPSを使って緯度、経度を取得できます。
$gps = Net_UserAgent_Mobile_GPS::factory(); // GPS情報を取得 $res = $gps->getGPSResponse(); // 緯度を取得 $lat = $res['lat']; // 経度を取得 $lon = $res['lon'];
Net_UserAgent_Mobile_GPSを利用すると上記のように3キャリアを意識せずにGPS位置情報を取得できます。
各キャリアでGPS位置情報取得URLを使用する場合の注意点
携帯で位置情報を取得する際には位置情報取得URLに付加するクエリについて注意しなければなりません。指定された書式以外の引数をつけることで位置情報が正確に取得できないことや、クエリが無視されて遷移先の画面で引き継げないことがあります。
またクエリによっては本来のキャリアのGPS位置情報取得URLに影響し、正常にGPS位置情報が取得できないことも考えられます。
NTTドコモの場合は公式にサポートされているiモードIDを取得するパラメータ「guid=ON」を除きます(※参考【iモードセンタの各種情報】)。
本記事ではアクティベーションに用いる変数「hash」を用いて投稿記事データを特定するため、位置情報取得後にも「hash」の値を引き継ぐ必要があります。そこでクエリでの変数引き継ぎを行わず、携帯電話機に割り当てられている一意なID(端末ID、後述)を取得して、取得した値をファイル名として一時ファイルを作成し、hashの値を書き込みます。GPS位置情報取得後の遷移先のphpでは再度端末IDを取得して一時ファイルを読み込み、hashの値を取得します。hashの値をファイルから取得した後で一時ファイルは削除します。
端末IDはキャリアによって呼び名が違います。NTTドコモでは「iモードID」、auでは「EZ番号」、ソフトバンクモバイルでは「端末シリアル番号」と呼ばれていますが、本記事内では便宜上「端末ID」とさせていただきます。
端末IDはNet_UserAgent_Mobile(※注1)のgetUID()メソッドを使用して取得できます。その際にはNTTドコモ端末の場合のみ、リンク先の画面で端末IDを取得する画面のURLに「guid=ON」の端末ID取得用のパラメータをつけます。
Net_UserAgent_Mobileについては以下の記事を参照ください。
- PHPライブラリ「Imagick」で携帯の機種に応じた画像を表示する(CodeZine)
$agent = Net_UserAgent_Mobile::singleton(); // 端末IDを取得 $uid = $agent->getUID();
上記メソッドで取得した端末IDの名前でファイルを読み書きすることでクエリを使わずにhashの値を遷移後の画面に渡します。
実際のファイルの読み書きはUtil.class.php内のメソッドで行います。
$util = new Util(); // hashの値を書き込む $util->setHash($uid, $hash);
// hashの値を取得 $hash = $util->getHash($uid);
パソコン向けブラウザではクッキーを使えば同じことができますが、携帯電話ではまだクッキーに対応していない機種が多いのでこのような形式にしました。
NTTドコモ端末でのXHTML出力
NTTドコモ端末でXHTMLを出力させる場合はヘッダに「Content-Type: application/xhtml+xml」と指定する必要があります。これはNTTドコモの仕様ではXHTMLのContent-Typeが「application/xhtml+xml」のみとなっており、「text/html」には対応していないためです。そのため、本サンプルではNTTドコモ端末でアクセスされた場合にheader関数で「Content-Type: application/xhtml+xml」を指定しています。
if(preg_match("/^DoCoMo/",$_SERVER["HTTP_USER_AGENT"])){ header("Content-Type: application/xhtml+xml; charset=Shift_JIS"); }
NTTドコモのXHTMLの詳細仕様については、作ろうiモード:XHTMLのページを確認ください。