Comment obtenir l'emplacement de l'utilisateur ?

Posté le 24. janvier 2023 par Jan Bunk


Nos applications modifient l'API JavaScript navigator.geolocation pour vous donner le maximum de possibilités de développement et offrir aux utilisateurs de vos applications une expérience optimale.

Vous pouvez utiliser les fonctions JavaScript de géolocalisation normalement, tant que vous gardez à l'esprit les limitations mentionnées sur cette page.

Fonctions supplémentaires

openAppLocationSettings

Cette fonction ouvre l'écran d'informations sur l'application sur Android et l'application des paramètres sur iOS, où l'utilisateur peut activer l'accès à la localisation pour l'application, même s'il a précédemment rejeté les invites d'autorisation.

Vous trouverez un exemple de code ainsi que les cas dans lesquels il peut être judicieux d'appeler cette fonction dans la section relative à la gestion des erreurs ci-dessous.

Vous pouvez écouter l'événement appResumed pour détecter quand l'utilisateur revient de la page des paramètres.

openDeviceLocationSettings

Cette fonction ouvre l'application des paramètres sur Android où l'utilisateur peut activer les services de localisation. Sur iOS, elle ouvre également l'application des paramètres, mais, en raison de limitations techniques, elle n'ouvre pas la page exacte où les services de localisation sont gérés.

Vous trouverez un exemple de code ainsi que les cas dans lesquels il peut être judicieux d'appeler cette fonction dans la section relative à la gestion des erreurs ci-dessous.

Vous pouvez écouter l'événement appResumed pour détecter quand l'utilisateur revient de la page des paramètres.

Gestion des erreurs

Il existe plusieurs sources d'erreurs potentielles lors de l'obtention de la position actuelle. Nous maintenons la compatibilité avec l'API de géolocalisation d'origine, mais nous fournissons également des informations supplémentaires sur ce qui n'a pas fonctionné.


function getAppErrorMessage(error) {
    if (error.hasOwnProperty("appMessage")) {
        return error.appMessage;
    }
    else {
        return null;
    }
}

var options = {
    enableHighAccuracy: true,
    timeout: 5000,
    maximumAge: 0
};

navigator.geolocation.getCurrentPosition(function(position) {
    // success
    console.log("Latitude: " + position.coords.latitude + ", Longitude: " + position.coords.longitude);
}, async function(error) {
    // error
    switch(error.code) {
        case error.PERMISSION_DENIED:
            // error.message is always "User denied Geolocation" to be consistent with browser behaviour
            console.log("User denied Geolocation");

            // Additional information only available for app users:
            if (getAppErrorMessage(error) === "Permission denied") {
                console.log("User did not grant the app permission to access the location, but we can try again later.");
            }
            else if (getAppErrorMessage(error) === "Permission denied permanently") {
                console.log("User did not grant the app permission to access the location and can only enable the permissions via the app settings.");

                // You can open the app settings like this:
                await openAppLocationSettings();
            }
            else if (getAppErrorMessage(error) === "Location service disabled") {
                console.log("User did not enable the location service setting in the device settings, even after being prompted to do so by the app.");

                // You can open the device's location settings like this:
                await openDeviceLocationSettings();
            }

            break;
        case error.POSITION_UNAVAILABLE:
            // can occurr in browsers with message "Unknown error acquiring position", but not used by the app at the moment
            console.log("Unknown error acquiring position");
            break;
        case error.TIMEOUT:
            // error.message is always "Position acquisition timed out" to be consistent with browser behaviour
            console.log("The request to get user location took longer than " + options.timeout + " milliseconds.");
            break;
    }

}, options);
    

Limitations

  • Lorsque vous appelez navigator.geolocation.getCurrentPosition, vous ne récupérez pas d'objet GeolocationCoordinates ou GeolocationPositionError, donc ne vérifiez pas son type. Vous pouvez néanmoins accéder à toutes les propriétés attendues.
  • Si certaines propriétés ne sont pas prises en charge par l'appareil, par exemple GeolocationCoordinates.altitudeAccuracy, un navigateur renverrait normalement null, alors que nous pourrions renvoyer 0, puisque c'est ce que nous obtenons de l'appareil.