web-dev-qa-db-fra.com

Ionic 2/Ionic 3: Comment localiser un périphérique

Ne marquez pas cette question comme un doublon, aucune des réponses de stackoverflow n'a fonctionné pour moi. Beaucoup d'entre eux sont pour Ionic 1 ou ces réponses sont obsolètes ou ne fonctionnent pas pour un appareil Android.

J'ai vu beaucoup de solutions sur stackoverflow pour obtenir l'emplacement actuel du périphérique, mais aucune d'entre elles ne semble fonctionner pour Android.

ce que j'ai essayé: -

Quoi qu'il en soit, tous ces éléments sont deprecated by google en raison de: -

getCurrentPosition () et watchPosition () sont déconseillées pour des raisons de sécurité origines, et le support sera supprimé dans le futur. Vous devriez Pensez à basculer votre application vers une origine sécurisée, telle que HTTPS . Voir goo.gl/rStTGz pour plus de détails.

Le problème avec la solution joshmorony ( https://www.joshmorony.com/adding-background-geolocation-to-an-ionic-2-application/ ) est de premier plan ne fonctionne pas pour les périphériques physiques Android. mais fonctionne bien pour le navigateur et iOS. Le suivi en arrière-plan fonctionne bien, ce qui prend presque 50 secondes pour donner le premier clic à la souris.

S'il vous plait, j'ai besoin de votre aide avec ceci. Je veux un moyen d'obtenir l'emplacement actuel en un minimum de temps. Pour votre information, j'utilise Google javascript map sdk/api.

16
kumar kundan

J'ai essayé toutes les solutions proposées par vous tous et d'autres également sur Internet. Enfin, j'ai trouvé une solution.Vous pouvez essayer ce plugin cordova-plugin-advanced-geolocation ( https://github.com/Esri/cordova-plugin-advanced-geolocation ) de ESRI. Mais ce plugin fonctionnera pour Android et non IOS. Pour iOS, vous pouvez utiliser la même vieille approche. i.e - en utilisant this.geolocation.getCurrentPosition(...) ou this.geolocation.watchPosition(..).

Ajouter un plugin comme ceci: -

cordova plugin add https://github.com/esri/cordova-plugin-advanced-geolocation.git

puis

declare var AdvancedGeolocation:any; // en haut de la classe

//**For Android**


    if (this.platform.is('Android')) {
          this.platform.ready().then(() => {
            AdvancedGeolocation.start((success) => {
              //loading.dismiss();
              // this.refreshCurrentUserLocation();
              try {
                var jsonObject = JSON.parse(success);
                console.log("Provider " + JSON.stringify(jsonObject));
                switch (jsonObject.provider) {
                  case "gps":
                    console.log("setting gps ====<<>>" + jsonObject.latitude);

                    this.currentLat = jsonObject.latitude;
                    this.currentLng = jsonObject.longitude;
                    break;

                  case "network":
                    console.log("setting network ====<<>>" + jsonObject.latitude);

                    this.currentLat = jsonObject.latitude;
                    this.currentLng = jsonObject.longitude;

                    break;

                  case "satellite":
                    //TODO
                    break;

                  case "cell_info":
                    //TODO
                    break;

                  case "cell_location":
                    //TODO
                    break;

                  case "signal_strength":
                    //TODO
                    break;
                }
              }
              catch (exc) {
                console.log("Invalid JSON: " + exc);
              }
            },
              function (error) {
                console.log("ERROR! " + JSON.stringify(error));
              },
              {
                "minTime": 500,         // Min time interval between updates (ms)
                "minDistance": 1,       // Min distance between updates (meters)
                "noWarn": true,         // Native location provider warnings
                "providers": "all",     // Return GPS, NETWORK and CELL locations
                "useCache": true,       // Return GPS and NETWORK cached locations
                "satelliteData": false, // Return of GPS satellite info
                "buffer": false,        // Buffer location data
                "bufferSize": 0,         // Max elements in buffer
                "signalStrength": false // Return cell signal strength data
              });

          });
        } else {

          // **For IOS**

          let options = {
            frequency: 1000,
            enableHighAccuracy: false
          };

          this.watch = this.geolocation.watchPosition(options).filter((p: any) => p.code === undefined).subscribe((position: Geoposition) => {
            // loading.dismiss();
            console.log("current location at login" + JSON.stringify(position));

            // Run update inside of Angular's zone
            this.zone.run(() => {
              this.currentLat = position.coords.latitude;
              this.currentLng = position.coords.longitude;
            });

          });
        }
3
kumar kundan

J'ai traversé le problème et trouver la solution.

le meilleur moyen d'obtenir la géolocalisation de l'utilisateur est d'utiliser ce plugin https://ionicframework.com/docs/native/geolocation/

n'oubliez pas d'ajouter ceci est app.moudle.ts en tant que fournisseur.

en ajoutant simplement ce code dans le composant d'application, j'ai pu obtenir l'emplacement (n'oubliez pas d'importer et d'ajouter constructeur)

 this.geolocation.getCurrentPosition({ enableHighAccuracy: true }).then((resp) => {
      console.log(resp);
    }, Error => {
      console.log(Error);
    }).catch(Error => {
      console.log(Error);
    })

je n'ai que la même erreur alors que j'utilisais ionic cordova run Android --livereload qui n'est pas sécurisé Origin

mais quand j'utilise ionic serve, je peux voir la réponse dans le navigateur et aussi après en utilisant ionic cordova lancer Android

juste pour confirmer la réponse sous Android, je vérifie le débogueur de chrome.

2
amyogiji

J'ai rencontré un problème similaire. Lorsque je construis à partir du terminal avec l'indicateur --prod, je ne vois plus cette erreur car il demande maintenant la position via https. 

Construit sans --prod flag

Construit avec le drapeau --prod

Edit: Désolé pour le format, j'espère que cela a un peu plus de sens. J'ai utilisé la fonction suivante dans un service que je pouvais appeler de n'importe où pour obtenir la latitude, la longitude, la précision et l'horodatage. La clé utilise cependant l'indicateur --prod dans le terminal lors de la construction de l'application.

this.geolocation.getCurrentPosition().then(position => {
     let locationObj = {
            lat: position.coords.latitude,
            lon: position.coords.longitude,
            timestamp: position.timestamp,
            accuracy: position.coords.accuracy
     };
resolve(locationObj);
})
0
Justin B