web-dev-qa-db-ja.com

コルドバのジオロケーションの精度は10メートルに制限されます

更新:これはGoogle Play開発者サービスの問題であり、内部で報告されています ここ バージョン13.4.0から修正されます

cordova gelocation plugin とメソッドnavigator.geolocation.watchPosition()をオプションenableHighAccuracy: trueとともに使用して、ユーザーの場所を追跡し、最も正確な結果を取得します。

私たちのアプリは1年以上前から存在しており、外で空が澄んでいるときは4/6メートルという非常に優れた位置精度を取得するデバイスに問題はありませんでした。

最近、私たちのユーザーの多くは、彼らが何をしても、10m未満の精度を得ることができないと報告しています。

自分でテストすることにしましたが、同じ問題があることがわかりました。当初、最新リリースでバグが発生したと考え、すべてをトリプルチェックしましたが、ジオロケーションに関連するコード/依存関係に変更を加えませんでした。

以前のバージョンのアプリもテストしました。4mの精度を得ることができたと確信していますが、驚くべきことに、どちらも機能せず、精度は10mに制限されています。

異なるバージョンのAndroidを試しましたが、5(Lollipop)から8(Oreo)までの任意のプラットフォームで問題を再現できます。iOS10/ 11でも同じ問題が発生します。数ヶ月でアプリを更新していません。

同じ問題について最近質問があります ここ

他の誰かがAndroidネイティブコード ここ を使用して同じ問題を抱えています

誰かが何が起こっているのか知っていますか?許可の問題ですか?位置情報サービスも高精度に設定されています。

完全を期すために、この古いバージョン(2.x)を使用して3/4メートルの精度を得ることができます プラグイン

それが行く唯一の方法ですか?

箱から出してすぐにうまく機能していたものに、余分な依存関係を導入したくはありません。

どうもありがとう

18
Mirko

関係者にとっては、Google Play開発者サービスの問題であり、内部で報告されています ここ バージョン13.4.0から修正されます

更新:Play開発者サービス14.3.66に更新した後に解決され、精度は再び4mに低下しました!

1
Mirko

ソースコードを見る:

古いプラグイン(2.x) ソース

  watchPosition: function(success, error, args) {
    var win = function() {
        var geo = cordova.require('cordova/modulemapper').getOriginalSymbol(window, 'navigator.geolocation');
        geo.watchPosition(success, error, {
            enableHighAccuracy: args[1]
        });
    };
    exec(win, error, "Geolocation", "getPermission", []);
},

新しいプラグイン(マスター) ソース

watchPosition: function(success, error, args) {
    var pluginWatchId = utils.createUUID();

    var win = function() {
        var geo = cordova.require('cordova/modulemapper').getOriginalSymbol(window, 'navigator.geolocation');
        pluginToNativeWatchMap[pluginWatchId] = geo.watchPosition(success, error, args);
    };

    var fail = function() {
        if (error) {
            error(new PositionError(PositionError.PERMISSION_DENIED, 'Illegal Access'));
        }
    };
    exec(win, fail, "Geolocation", "getPermission", []);

    return pluginWatchId;
},

OLDプラグインコードではenableHighAccuracyは(配列のarg1)によって設定されたブール値です。

プラグインの新しいバージョンでは、フラグが設定されたJSONとしてargを渡す必要があります:{enableHighAccuracy:true}geo.watchPosition関数への同じ呼び出しを高精度で再現します。

旧式:

navigator.geolocation.watchPosition(geolocationSuccess,
                                                  geolocationError,
                                                  [false,true]);

新しい方法:

navigator.geolocation.watchPosition(geolocationSuccess,
                                                  geolocationError,
                                                  { enableHighAccuracy: true });
4
Frix33