Cómo: Obtener la ubicación del usuario

Publicado en 24. enero 2023 por Jan Bunk


Nuestras aplicaciones modifican la API navigator.geolocation de JavaScript para proporcionarte la mayor capacidad de desarrollo y una experiencia óptima a los usuarios de tu aplicación.

Puedes utilizar las funciones JavaScript de geolocalización con normalidad, siempre que tengas en cuenta las limitaciones mencionadas en esta página.

Funciones adicionales

openAppLocationSettings

Esta función abre la pantalla de información de la aplicación en Android y la aplicación de configuración en iOS, donde el usuario puede habilitar el acceso a la ubicación para la aplicación, aunque previamente haya rechazado las solicitudes de permiso.

Puedes encontrar un ejemplo de código junto con los casos en los que podría tener sentido llamar a esta función en la sección de control de errores más abajo.

Puedes escuchar el evento appResumed para detectar cuando el usuario volvió de la configuración.

openDeviceLocationSettings

Esta función abre la app de configuración en Android, donde el usuario puede activar los servicios de ubicación. En iOS también abre la app de configuración, pero, debido a limitaciones técnicas, no se abre la página exacta donde se configuran los servicios de ubicación.

Puedes encontrar un ejemplo de código junto con los casos en los que podría tener sentido llamar a esta función en la sección de control de errores más abajo.

Puedes escuchar el evento appResumed para detectar cuando el usuario volvió de la configuración.

Control de errores

Hay un par de fuentes de errores posibles al obtener la ubicación actual. Mantenemos la compatibilidad con la API de geolocalización original, pero también proporcionamos información adicional sobre lo que falló exactamente.


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);
    

Limitaciones

  • Cuando llames a navigator.geolocation.getCurrentPosition, no obtendrás de vuelta un objeto GeolocationCoordinates o GeolocationPositionError, así que no compruebes su tipo. Sin embargo, puedes acceder a todas las propiedades esperadas.
  • Si el dispositivo no es compatible con algunas propiedades, por ejemplo GeolocationCoordinates.altitudeAccuracy, un navegador normalmente devuelve null, mientras que nosotros podemos devolver 0, ya que eso es lo que obtenemos del dispositivo.