iOS/Androidの両方で使えるようにHTML5のアプリケーションキャッシュを使ってOfflineでも使えるようにしました。
で、せっかくなので二つのイベントに応募しました。
ただ、自分はiPhoneユーザーなのでiPhoneでの動作確認はできていたのですが、動作確認用にAndroid端末を購入して試したところ動作しない(位置情報がほとんどとれない)ことが判明。そこで調査を行いました。
結論から言うと、
「AndroidのWebブラウザでは、電波のないところでの位置情報取得は基本的には不可」
です。ただ、WebViewだけの簡単なAndroidアプリにすれば位置情報がとれることがわかりました。そこで技術メモとして公開します。
Offline位置情報取得の問題点
山では電波の通じないところがほとんどなので、このWebアプリは(Webアプリなのに)Offlineで使う前提になります。また位置情報を取得するためにGPSの情報を取得する必要があります。
なので、Webアプリのキモになる技術は、HTML5の
- geolocation API
- application cache
- localStorage API
になります。それぞれの機能は特別ではなく、ググればたくさん情報が見つかるため、基本的な機能は実装できるのですが、いざ山で使ってみると位置情報が取れない、正しくない、などの事態が発生。geolocation APIが曲者でした。
iPhoneでの注意点
iPhoneでも少しクセがあったのでメモしておきます。
- 「機内モード」ではGPS機能も停止してしまう
→ バッテリー消耗をきにする場合は「機内モード」ではなく「モバイルデータ通信」と「Wi-Fi」をOFFにすること(もちろん、「位置情報サービス」はON) - 位置情報はキャッシュされてしまう様子。そのため、正しい位置情報が記録されない
→ 位置情報取得を3回実行して、3回目の結果を採用する ※あくまで暫定対応なので改善の余地あり。
これらは原因がわかったのでまだよかったのですが、Androidではほとんど位置情報がとれませんでした。(たまにとれることはありました)
Androidでの調査結果
そこでAndroidについて色々調べてみたところ、Stack Overflowでも同じような質問が出ていました。
他にも「html5 offline geolocation」でググると色々出てきますが解決策は特に見当たりませんでした。(ほとんど英語なので見落としてたかもしれませんが…)
なので、自分で端末を実際にいじって調査しました。結果は以下の通りです。
なので、自分で端末を実際にいじって調査しました。結果は以下の通りです。
- Google Mapを起動するとステータスバーにGPSマークが出て、アプリを閉じるとマークが消える。
- Webブラウザでgeolocation APIを実行しても、ステータスバーにGPSマークが出ない。
※Androidの位置情報モードを「端末のみ(GPSで現在地を特定する)」にしていても同様。 - 位置情報を使用するネイティブアプリ(以下、サンプルアプリ)を作成して実行したところ、Google Mapと同じようにGPSマークが表示される。 ※参考:条件にあう位置情報プロバイダから、位置情報を利用する簡単な例
- サンプルアプリで、アプリがバックグラウンドに行った時にも位置情報取得を継続するようにしておく(つまり、OnPause()時に何もしない)と、このアプリを閉じてもステータスバーのGPSマークは残ったままになる。この状態でWebブラウザでgeolocation APIを実行すると位置情報がとれる!
- Androidの「設定>位置情報」に表示される「最近の位置情報リクエスト」では、ブラウザ(Chrome)は「低い電池使用量」だが、Google Mapやサンプルアプリは「高い電池使用量」である。
これから、
「AndroidのWebブラウザでは、電波のないところでの位置情報取得は基本的には不可」
と結論づけました。しかし、4.の結果からWebViewだけの簡単なAndroidアプリを作ったところ位置情報を取ることができました。
ただ、WebViewでHTML5の機能を使ったり、ネイティブアプリとして操作できるようにするには少し工夫が必要だったため、それはまた次回紹介します。
0 件のコメント:
コメントを投稿