web-dev-qa-db-fra.com

La précision de géolocalisation de Cordova est limitée à 10 mètres

Mise à jour: il s'agit d'un problème lié au service Google Play, signalé en interne ici et il sera corrigé à partir de la version 13.4.0.

Nous utilisons le plugin cordova gelocation et la méthode navigator.geolocation.watchPosition() avec l'option enableHighAccuracy: true pour suivre l'emplacement de l'utilisateur et obtenir les résultats les plus précis possible.

Notre application existe depuis plus d'un an et nous n'avions aucun problème à obtenir un appareil d'une très bonne précision de localisation, 4/6 mètres lorsque l'extérieur et le ciel sont dégagés. 

Dernièrement, de nombreux utilisateurs signalent qu'ils ne peuvent obtenir quoi que ce soit avec une précision inférieure à 10 m, peu importe ce qu'ils font. 

Nous avons décidé de le tester nous-mêmes et nous avons constaté que nous avions le même problème. Initialement, nous pensions avoir introduit un bug dans notre dernière version, nous avons vérifié tout, mais nous n’avons apporté aucune modification au code/aux dépendances impliquant la géolocalisation.

Nous avons également testé les anciennes versions de notre application. Nous sommes sûrs qu’il était possible d’obtenir une précision de 4 m, mais étonnamment, elles ne fonctionnent pas non plus. La précision est limitée à 10 m.

Nous avons essayé différentes versions d'Android et nous pouvons reproduire le problème sur n'importe quelle plate-forme de 5 (Lollipop) à 8 (Oreo). Nous avons également le même problème sur iOS 10/11. Encore une fois, nous n'avons pas mis à jour l'application depuis des mois.

Il y a une question récente sur le même sujet ici

Quelqu'un d'autre a le même problème en utilisant le code natif Android ici

Est-ce que quelqu'un sait ce qu'il se passe? Est-ce un problème de permission? Les services de localisation sont également réglés sur Haute précision.

Par souci d’exhaustivité, nous sommes en mesure d’obtenir une précision de 3/4 mètres en utilisant l’ancienne version (2.x) de ce plugin

Est-ce la seule façon d'y aller? 

Nous préférerions ne pas introduire de dépendance supplémentaire pour quelque chose qui fonctionnait si bien hors de la boîte.

Merci beaucoup

18
Mirko

Pour les personnes concernées, il s'agit d'un problème lié aux services Google Play, signalé en interne ici et il sera corrigé à partir de la version 13.4.0.

Mise à jour: résolu après la mise à jour vers Play Services 14.3.66, précision à nouveau jusqu'à 4 m!

1
Mirko

En regardant le code source:

Ancien plugin (2.x) Source

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

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

Dans OLD plugin, le code enableHighAccuracy est un booléen défini par (arg1 du tableau).

Avec la NOUVELLE version du plug-in, vous devez passer arg comme JSON avec cet ensemble d'indicateurs: {enableHighAccuracy: true} pour reproduire le même appel dans la fonction geo.watchPosition avec une grande précision.

Old Way:

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

Nouvelle façon:

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