SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

目的に応じて適材適所で使うPHPライブラリ

GPS携帯を使った口コミサイト構築 - Google Map上に投稿データを展開する -

目的に応じて適材適所で使うPHPライブラリ(4)


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

GPS位置情報取得URLの出力

 前回の最後にメール送信したURL(http://[ドメイン名]/gps.php?hash={ハッシュ値}&guid=ON")にアクセスするところからの説明になります(hash、guid=ONについては後ろの項で説明します)。

 この画面にアクセスした際にGPS位置情報取得URLをNet_UserAgent_Mobile_GPSを利用して出力します。Net_UserAgent_Mobile_GPSを利用してのGPS位置情報取得URL出力は次のようになります。

[リスト1]gps.php(抜粋)
$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を使って緯度、経度を取得できます。

[リスト2]confirm.php(抜粋)
$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取得用のパラメータをつけます。

※注1

 Net_UserAgent_Mobileについては以下の記事を参照ください。

[リスト3]gps.php(抜粋)
$agent = Net_UserAgent_Mobile::singleton();
// 端末IDを取得
$uid = $agent->getUID();

 上記メソッドで取得した端末IDの名前でファイルを読み書きすることでクエリを使わずにhashの値を遷移後の画面に渡します。

 実際のファイルの読み書きはUtil.class.php内のメソッドで行います。

[リスト4]gps.php(抜粋)
$util = new Util();
// hashの値を書き込む
$util->setHash($uid, $hash);
[リスト5]confirm.php(抜粋)
// 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」を指定しています。

[リスト6]gps.php(抜粋)
if(preg_match("/^DoCoMo/",$_SERVER["HTTP_USER_AGENT"])){
    header("Content-Type: application/xhtml+xml; charset=Shift_JIS");
}

 NTTドコモのXHTMLの詳細仕様については、作ろうiモード:XHTMLのページを確認ください。

次のページ
逆ジオコーディングによる地名の取得

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
目的に応じて適材適所で使うPHPライブラリ連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 片渕 彼富(カタフチ カノトミ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/4833 2010/03/03 11:53

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング