GPSを使わずにユーザーの位置情報を取得する方法

  • 47
    Like
  • 3
    Comment

Why?

モバイルアプリやゲームを作っていると、カジュアルにユーザーのおおまかな位置情報が欲しいと思うことは無いでしょうか?
しかし、AndroidやiOSでいちいちGPS使用権限の許可を得るのも大げさ。
そんなときにCloud Functions for Firebaseを使えば、カンタンに、しかも破格の料金1でユーザーの大まかな位置情報を取得することができます。

1-P96fpzo_Tr0PgJwZjEjHxw.png

How?

Cloud Functionsでは、リクエストヘッダ x-appengine-citylatlong 内にアクセスユーザーのおおまかな位置情報を表す緯度経度情報が入っています。ですので、このヘッダ情報を出力するfunctionを定義するだけで、いとも簡単に目的を達成できます。
なお精度に関して手元で検証したところ、現在位置の市区町村の役所の位置が出力されるようです。
例えば港区内でアクセスすると、35.658068,139.751599が返ってきます。

map.png
IPアドレスから位置情報が算出されるため、大きく異なるケースがあるのはご了承ください。

準備

Firebaseにログインしプロジェクトを作成した後、ターミナルで以下を実行します。

# firebase-toolsをインストール
$ npm install -g firebase-tools

$ cd myproject

# Firebaseにログイン
$ firebase login

# Cloud Functions の初期化
$ firebase init functions

これでCloud Functionsを書き始める準備ができました。

コードを書く

myproject/functions/index.js をエディタで開き、以下のコードを追加します。

exports.getLocation = functions.https.onRequest((req, res) => {
    var latlng = req.get("x-appengine-citylatlong");
    res.send(latlng);
});

デプロイ

$ firebase deploy --only functions

上記のコマンドでfunctionがデプロイされ、functionを実行するためのURLが表示されます。以下が結果のサンプルです。もしFunction URLが表示されない場合には、少し待ってからもう一度上記コマンドを実行してみましょう。

=== Deploying to 'sandbox-c9720'...
...
✔  Deploy complete!

Project Console: https://console.firebase.google.com/project/sandbox-c9720/overview
Function URL (getLocation): https://us-central1-sandbox-c9720.cloudfunctions.net/getLocation

こちらが実際にデプロイしたスクリプトです。
https://us-central1-sandbox-c9720.cloudfunctions.net/getLocation
アクセスすると位置情報が出力されるので、GoogleMapsなどで表示して確認してみましょう。

これで、このURLをアプリから叩いて利用することができるようになりました。

まとめ

いかがでしたか?
もともと x-appengine-citylatlong はGoogle App Engineで扱える情報でしたが、Cloud Functionsを使うことで、さらに手軽に実装することができました。
こういう小さな機能を実装するときは、Cloud Functionsがとても便利ですね。


  1. 無料プランの場合は12.5万回/月まで。従量制プランの場合200万回/月の呼び出しまで無料。以降は $0.40/100万回 とのことです。