Monacaアプリはハイブリッドアプリという特性上、バックグラウンドでは処理が実行できなくなるという制約が生じます。そんな問題を乗り越えるために幾つかのプラグインが存在します。

今回はバックグラウンドでも位置情報を取得し続けられるtransistorsoft/cordova-background-geolocation-ltを紹介します。なお、Android版のプラグインは有料のようです。そのため今回のサンプルはiOSで試しています。

インストール

プラグインのインストールはMonaca IDEのCordovaプラグインの管理にて行います。 cordova-background-geolocation-lt を指定してインストールします。

基本的な使い方

ごく基本的な使い方は次のようになります。

  • 初期設定
  • データ取得時のコールバック設定
  • データ取得失敗時のコールバック設定
  • 各コールバックを設定

それぞれについて紹介します。

初期設定

まず最初にオブジェクトを作ります。(devicereadyイベント発生後に実行するようにしてください)

次に設定を行います。

データ保存先については設定で指定することもできますし、データ取得時のコールバックで設定もできます。

データ取得時のコールバック関数

データを取得した際のコールバック関数には位置情報とタスクIDが送られます。必ず最後には bgGeo.finish(タスクID); を実行します。

locationには位置情報データが入ってきます。バッテリー情報や、アクティビティの状態(徒歩、車、電車など)も取得できます。

データ取得失敗時のコールバック関数

データの取得に失敗した時のコールバック関数ではエラーメッセージを出すなどの処理を行うことになるかと思います。

各コールバックを設定

最後に各コールバックを設定します。

これで準備完了です。アプリを起動して、近くを歩き回ると自動的に位置情報が取得され続けるようになります。なお、初回実行時には位置情報の取得とモーションとフィットネスのアクティビティへのアクセス権限が求められます。初期設定で debug: true に設定している場合はさらにプッシュ通知(ローカルプッシュ)のアクセス権限も必要です。

データをニフティクラウド mobile backendへ保存する

データを取得するだけでは面白みがありませんので、可視化してみたいと思います。まず取得されるデータをニフティクラウド mobile backend へ保存してみたいと思います。ニフティクラウド mobile backendはmBaaS(mobile Backend As a Service)と呼ばれるサービスで、アプリ開発で必要になるバックグラウンド系(サーバ系)のサービスを提供してくれます。今回はその一機能である位置情報検索を利用します。

ニフティクラウド mobile backendにユーザ登録すればアプリケーションキーとクライアントキーが得られますので、それを使います。また、JavaScript SDKをMonaca IDEのJS/CSSコンポーネントの追加と削除から追加します。検索時に ncmb を指定してください。

まず ncmb オブジェクトを初期化します。アプリケーションキー(application_key)とクライアントキー(client_key)はそれぞれニフティクラウド mobile backendへ登録した際に取得できるものと置き換えてください。

コールバック時にデータを登録する

次に位置情報データをニフティクラウド mobile backendへ登録するようにします。先ほど作成したデータ取得時のコールバック関数内に以下のコードを追記してください。

これでデータがクラウド上に保存されます。歩いてみた印象では10〜30秒に一回くらいのペースで記録されているようです。

データを可視化する

次にデータを可視化するのですが、今回はGoogleマップに表示を行います。JavaScriptのgmaps.jsというライブラリを使ったので、JS/CSSコンポーネントの追加と削除にてgmapsと検索してライブラリを追加します。ローダーに追加するのは components/gmaps/gmaps.min.js です。

また、Googleマップを使う際にはAPIキーが必要なので ウェブ向け Google Maps API  |  Google Developers より取得します。取得したら次のようにHTML側で読み込みます。

そして、アプリを起動した際に位置情報を取得して、その位置情報を中心点としてニフティクラウド mobile backendの検索と地図表示を行います。検索した結果得られたデータは、地図上に線でつないで描写していきます。

これを実行すると、次のように線が表示されます。細かく、正確にデータを収集しているのが分かるかと思います。

バックグラウンド実行に対応しているのでアプリが前面にある必要はありません。持ち歩いているだけでデータの収集が行われています。今回のようにデータをクラウドに保存する仕組みにしていると常時通信が行われ続ける点に注意してください( bgGeo.stop() で停止できます)。


今回ご紹介した機能は、ジョギングアプリなどの外出先で使う系統のアプリで特に有効です。個人のデータを蓄積するだけであればローカルのSQLite上に保存しても良さそうですし、クラウドに保存すればバックアップ用途やマルチデバイス利用シーンで活用できるでしょう。

今回のコードはmoongift/MonacaWithBackgroundGeoにアップしてあります。不明点があれば参考にしてください。