webentwicklung-frage-antwort-db.com.de

Die geografische Position von Cordova wird auf 10 Meter begrenzt

Update: Es handelt sich um ein Problem mit dem Google Play Service, das intern here gemeldet wird und ab Version 13.4.0 behoben wird

Wir verwenden das cordova-Gelocation-Plugin und die Methode navigator.geolocation.watchPosition() mit der Option enableHighAccuracy: true, um den Standort des Benutzers zu verfolgen und die genauesten Ergebnisse zu erhalten.

Unsere App gibt es seit mehr als einem Jahr und wir hatten bisher keine Probleme damit, dass jedes Gerät eine sehr gute Ortsgenauigkeit von 4/6 Metern hat, wenn es draußen ist und der Himmel klar ist. 

In letzter Zeit berichten viele unserer Benutzer, dass sie unter keinen Umständen eine Genauigkeit von weniger als 10 Metern erreichen können, egal was sie tun. 

Wir haben uns entschieden, es selbst zu testen, und wir fanden das gleiche Problem. Anfangs dachten wir, wir hätten in unserer neuesten Version einen Fehler eingeführt. Wir haben alles dreimal geprüft, aber wir haben keine Änderungen am Code/den Abhängigkeiten vorgenommen, die die Geolocation betreffen.

Wir haben auch ältere Versionen unserer App getestet, bei denen wir sicher waren, dass eine Genauigkeit von 4 m erzielt werden konnte, aber überraschenderweise funktionieren sie auch nicht. Die Genauigkeit ist auf 10 m begrenzt.

Wir haben verschiedene Android-Versionen ausprobiert und können das Problem auf jeder Plattform von 5 (Lollipop) bis 8 (Oreo) reproduzieren. Das gleiche Problem haben wir auch auf iOS 10/11. Wieder haben wir die App seit Monaten nicht aktualisiert.

Es gibt eine aktuelle Frage zum selben Thema hier

Jemand anderes hat das gleiche Problem mit dem nativen Code von Android. Here

Weiß jemand was los ist? Ist es eine Erlaubnisfrage? Location Services sind ebenfalls auf Hohe Genauigkeit eingestellt.

Der Vollständigkeit halber können wir mit der alten Version (2.x) dieses plugin eine Genauigkeit von 3/4 Metern erreichen.

Ist das der einzige Weg? 

Wir möchten lieber keine zusätzliche Abhängigkeit für etwas einführen, das so gut funktioniert hat.

Danke vielmals

18
Mirko

Für wen es sich interessieren könnte, handelt es sich um ein Google Play Services-Problem, das intern hier gemeldet wird und ab Version 13.4.0 behoben wird

Update: behoben nach Update auf Play Services 14.3.66, Wiederholgenauigkeit bis 4m!

1
Mirko

Quellcode betrachten:

Altes Plugin (2.x) Quelle

  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", []);
},

Neues Plugin (Master) Source :

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;
},

Im OLD-Plugin-Code ist enableHighAccuracy ein boolescher Satz von (arg1 des Arrays).

Mit der NEUEN Version des Plugins müssen Sie arg als JSON übergeben, wobei das Flag gesetzt ist: {enableHighAccuracy: true}, um denselben Aufruf der Funktion geo.watchPosition mit hoher Genauigkeit zu reproduzieren.

Alter Weg:

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

Neuer Weg:

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