Точность геолокации Кордовы ограничена 10 метрами

Обновление: это проблема службы Google Play, о которой сообщается здесь, и она будет исправлена с версии 13.4.0.

Мы используем плагин cordova gelocation и метод navigator.geolocation.watchPosition() с опцией enableHighAccuracy: true чтобы отслеживать местоположение пользователя и получать наиболее точные результаты.

Наше приложение существует уже более 1 года, и у нас не было проблем с тем, чтобы какое-либо устройство получало очень хорошую точность определения местоположения, 4/6 метров на улице и в ясном небе.

В последнее время многие из наших пользователей сообщают, что они не могут получить точность менее 10 м независимо от того, что они делают.

Мы решили проверить это сами, и мы обнаружили, что та же проблема. Изначально мы думали, что в нашем последнем выпуске были обнаружены некоторые ошибки, мы все трижды проверили, но не внесли изменений в код/​​зависимости, связанные с геолокацией.

Мы также протестировали более старые версии нашего приложения, где мы уверены, что можно получить точность до 4 м, но, что удивительно, они тоже не работают, точность ограничена на 10 м.

Мы пробовали разные версии Android и можем воспроизвести проблему на любой платформе от 5 (Lollipop) до 8 (Oreo). У нас также есть такая же проблема на iOS 10/11. Опять же, мы не обновляли приложение месяцами.

Есть недавний вопрос об этой же проблеме здесь:

У кого-то есть такая же проблема с использованием нативного кода Android здесь

Кто-нибудь знает что происходит? Это вопрос разрешения? Службы определения местоположения также настроены на высокую точность.

Для полноты мы можем получить точность 3/4 метра, используя старую версию (2.x) этого плагина.

Это единственный путь?

Мы бы предпочли не вводить дополнительную зависимость для чего-то, что работало так хорошо из коробки.

Большое спасибо

Ответ 1

Для кого это может касаться, это проблема Служб Google Play, о которой сообщается здесь, и она будет исправлена с версии 13.4.0

Обновление: решено после обновления до Play Services 14.3.66, точность снова до 4 м!

Ответ 2

Глядя на исходный код:

Старый плагин (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 массива).

С новой версией плагина вам нужно передать arg как JSON с указанным флагом: {enableHighAccuracy: true}, чтобы воспроизвести тот же вызов функции geo.watchPosition с высоким точность.

Старый путь:

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

Новый способ:

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