Utilisation de la géolocalisation

Firefox 3.5 et plus prend en charge l'API de géolocalisation; cela permet à l'utilisateur de donner sa position aux applications Web s'il le désire. Pour des raisons de vie privé, l'utilisateur doit confirmer pour la permission d'utiliser les informations sur sa position.

Firefox 3.5 prend en charge la localisation à partir des informations WiFi en utilisant Google Location Services. Durant la transaction entre Firefox et Google, des données sont échangées comme les données du point d'accès WiFi, un jeton d'accès (similaire à un cookie de 2 semaines) ainsi que l'adresse IP de l'utilisateur. Pour plus d'information, vous pouvez consulter la politique de confidentialité de Mozilla ainsi que la politique de confidentialité de Google expliquant comment ces données sont utilisées. Vous pouvez aussi jeter un oeil au code source si vous êtes curieux de savoir comment le service est implémenté.

Note : Si vous êtes intéressés pour écrire un fournisseur de géolocalisation -- un service qui peut être utilisé via des requêtes pour obtenir la position de l'utilisateur -- merci de consulter nsIGeolocationProvider. La documentation sur le service de surveillance de point d'accès WiFi peut aussi vous intéresser.

Firefox 3.6 (Gecko 1.9.2) ajoute la prise en charge du service GPSD (démon GPS), permettant la géolocalisation sur Linux.

Note : Les extensions hébergées sur addons.mozilla.org doivent demander une permission explicitement avant d'accéder aux données de géolocalisation.

L'objet géolocalisation

L'API de géolocalisation est publiée via un objet enfant geolocation à l'intérieur de l'objet navigator. Si l'objet existe, les services de géolocalisations sont disponibles. Vous pouvez tester la présence de la géolocalisation ainsi :

if ("geolocation" in navigator) {
  /* si la géolocalisation est disponible */
} else {
  alert("Je suis désolé, mais les services de géolocalisation de sont pas pris en charge par votre navigateur.");
}

Depuis Gecko 1.9.2 (Firefox 3.6), les modules complémentaires peuvent se servir de l'objet géolocalisation en utilisant une référence au service de géolocalisation comme ceci :

var geolocation = Components.classes["@mozilla.org/geolocation;1"]
                            .getService(Components.interfaces.nsIDOMGeoGeolocation);

Récupérer la position actuelle

Pour récupérer la position actuelle de l'utilisateur, vous pouvez appeler la méthode getCurrentPosition(. Ceci va initier une requête asynchrone pour détecter la position de l'utilisateur et faire une requête au matériel en charge de la localisation pour obtenir une information à jour. Lorsque la position est déterminée, une routine de callback spécifiée est exécutée. Vous pouvez optionnellement prévoir un second callback à exécuter si une erreur se produit. Un troisième paramètre optionnel est une interface d'options où vous pouvez régler la durée maximum de la position renvoyée et le temps à attendre pour une requête.

Utilisez getCurrentPosition() si vous désirez que la position soit renvoyée dès que possible, peut importe la précision. Les périphériques avec un GPS par exemple peuvent prendre une minute ou plus pour obtenir une position GPS, celà veut dire que des données moins précises (Emplacement de l'adresse IP ou WiFi) seront renvoyées à getCurrentPosition() au début.

navigator.geolocation.getCurrentPosition(function(position) {
  faire_quelquechose(position.coords.latitude, position.coords.longitude);
});

L'exemple ci-dessus fera s'exécuter la fonction faire_quelquechose() lorsque la position sera obtenue.

Observer la position actuelle

Si les données de la position changent (Soit par un mouvement du périphérique ou si des données de géolocalisation plus précises arrivent), vous pouvez mettre en place un callback qui sera appelé avec l'information de l'emplacement mis à jour. Cela est possible en utilisant la fonction watchPosition() qui possède les même paramètres d'entrée que getCurrentPosition(). Ses callbacks sont appelés plusieurs fois, permettant au navigateur de mettre à jour votre position pendant votre déplacement ou en donnant une meilleure précision de l'emplacement pendant que différentes techniques sont utilisées pour vous géolocaliser. Le callback d'erreur qui est optionnel comme pour getCurrentPosition(), est appelé une seule fois, si aucun résultats valides ne seront renvoyés.

Vous pouvez utiliser watchPosition()sans appel initial de getCurrentPosition().

var watchID = navigator.geolocation.watchPosition(function(position) {
  faire_quelquechose(position.coords.latitude, position.coords.longitude);
}
);

La méthode watchPosition() retourne un nombre ID qui peut être utilisé pour identifier exclusivement l'observateur de position demandé; vous pouvez utiliser cette valeur en tandem avec la méthode clearWatch() pour arrêter d'observer la position de l'utilisateur.

navigator.geolocation.clearWatch(watchID);

watchPosition() accepte en retour un succès et un retour d'erreur (comme getCurrentPosition) et de façon optionnel l'objet positionObjects , qui peut avoir trois propriétés :

  • enableHighAccuracy – Un booléen qui indique a l'appareil que vous voulez obtenir une position très précise (ce paramètre peut, ou pas, faire une différence, ça dépend de votre configuration).
  • maximumAge – L'âge maximum (en millisecondes) de lecture (peut dépendre de la configuration de l'appareil en fonction de la charge de la batterie/ou de la bande passante).
  • timeout – Le temps maximum (en millisecondes) ou vous autoriser l'appareil a vous communiquer sa géolocalisation.

Un appel a watchPosition devrait  donc ressembler a ça :

var wpid = navigator.geolocation.watchPosition(geo_success, geo_error, {enableHighAccuracy:true, maximumAge:30000, timeout:27000});

Une démo se trouve ici : http://www.thedotproduct.org/experiments/geo/


Décrire une position

La localisation de l'utilisateur est décris comme un objet Position qui a les champs suivants :

timestamp
L'heure de lecture de la position DOMTimeStamp.
coords
Un objet nsIDOMGeoPositionCoords indiquant la localisation.
address
Un objet nsIDOMGeoPositionAddress spécifiant l'adresse correspondante, si disponible.

Traitement d'erreur

Le retour d'erreur, si il y en as un en appelant getCurrentPosition() ou watchPosition(), ressemble a ça:

function errorCallback(PositionError error);

La structure PositionError contient les champs suivants :

code
Un code d'erreur numérique qui doit être un des suivants :
UNKNOWN_ERROR (erreur numérique 0)
Le processus d'acquisition de la localisation a échoué suite a une erreur non prévu ou non couverte par les autres codes d'erreur.
PERMISSION_DENIED (erreur numérique 1)
Le processus d'acquisition de la localisation a échoué car la l'application d'origine n'a pas les droit d'accéder a l'API de géolocalisation.
POSITION_UNAVAILABLE (erreur numérique 2)
La localisation de l'appareil ne peut pas être déterminée. Un ou plusieurs fournisseurs utilisés pour localiser l'appareil on retourné un code d'erreur qui empêche la requête entière de fonctionner.
TIMEOUT (erreur numérique 3)
La temps maximum d’exécution spécifié a été dépassé avant d'arriver a résoudre la localisation.
 
message
Un message d'erreur lisible par un humain, mais pas a afficher a l'utilisateur.

Compatibilité des navigateurs

Navigateur Support basic Geolocation Level 2
Internet Explorer (none, as of IE9 pp7) ---
Firefox (Gecko) 3.5 (1.9.1) ---
Opera 10.60 ---
Safari | Chrome | WebKit 5 | 5 | 533 ---

Demander la permission

Tous les add-ons hébergé sur addons.mozilla.org qui utilise la géolocalisation doit vous demander explicitement avant de l'utiliser. La fonction suivante demande la permission a l'utilisateur de la même façon qu'une page web. La réponse de l'utilisateur est sauvée via le paramètre pref, si disponible. La fonction fourni dans le paramètre de retour qui sera appelé a une valeur booléenne indiquant la réponse de l'utilisateur. Si true, l'add-on peut accéder au données de géolocalisation.

function prompt(window, pref, message, callback) {
  let branch = Components.classes["@mozilla.org/preferences-service;1"]
               .getService(Components.interfaces.nsIPrefBranch2);
  if (branch.getPrefType(pref) === branch.PREF_STRING) { 
    switch (branch.getCharPref(pref)) { 
      case "always": return callback(true); 
      case "never": return callback(false); 
    } 
  }

  let done = false; 
  function remember(value, result) { 
    return function () { 
      done = true; 
      branch.setCharPref(pref, value); 
      callback(result); 
    } 
  }

  let self = window.PopupNotifications.show(window.gBrowser.selectedBrowser, 
                                            "geolocation", 
                                            message, 
                                            "geo-notification-icon", 
                                            { 
                                              label: "Share Location", 
                                              accessKey: "S", 
                                              callback: function (notification) { 
                                                done = true; callback(true); 
                                              } 
                                            }, 
                                            [{
                                                label: "Always Share", 
                                                accessKey: "A", 
                                                callback: remember("always", true) 
                                              }, { 
                                                label: "Never Share", 
                                                accessKey: "N", 
                                                callback: remember("never", false) 
                                            }], 
                                            { 
                                              eventCallback: function (event) { 
                                                if (event === "dismissed") { 
                                                  if (!done) callback(false); 
                                                  done = true; 
                                                  window.PopupNotifications.remove(self); 
                                                } 
                                              }, 
                                              persistWhileVisible: true 
                                            }); 
}

prompt(window, 
       "extensions.foo-addon.allowGeolocation", 
       "L'add-on Foo veut connaitre votre localisation.", 
       function callback(allowed) { alert(allowed) });

Voir aussi

Étiquettes et contributeurs liés au document

Contributeurs ayant participé à cette page : Nigel_Sheldon, GeekShadow, jackblack
Dernière mise à jour par : Nigel_Sheldon,