Edited at

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

More than 1 year has passed since last update.


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万回 とのことです。