Como obter a localização do usuário?

Publicado em 24. janeiro 2023 por Jan Bunk


Nossos aplicativos modificam o navigator.geolocation JavaScript API para dar a você o máximo de capacidades de desenvolvimento e aos seus usuários de aplicativos a experiência ideal.

Você pode usar as funções de geolocalização JavaScript naturalmente, desde que você mantenha as limitações mencionadas nesta página em mente.

Funções adicionais

openAppLocationSettings

Esta função abre a tela de informações do aplicativo no Android e as configurações do aplicativo no iOS, onde o usuário pode habilitar o acesso de localização para o aplicativo, mesmo que ele tenha previamente rejeitado as solicitações de permissão.

Você pode encontrar uma amostra de código e quando poderia fazer sentido chamar esta função na seção de tratamento de erros abaixo.

Você pode ouvir o appResumed event para detectar quando o usuário retornou das configurações.

openDeviceLocationSettings

Esta função abre o aplicativo de configurações no Android onde o usuário pode habilitar os serviços de localização. No iOS ele também abre o aplicativo de configurações, mas, devido a limitações técnicas, não na página exata onde os serviços de localização são gerenciados.

Você pode encontrar uma amostra de código e quando poderia fazer sentido chamar esta função na seção de tratamento de erros abaixo.

Você pode ouvir o appResumed event para detectar quando o usuário retornou das configurações.

Tratamento de erros

Há um par de fontes potenciais de erro ao se obter a localização atual. Nós mantemos compatibilidade com a API de geolocalização original, mas também fornecemos informações adicionais sobre o que exatamente deu errado.


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

Limitações

  • Quando você chama navigator.geolocation.getCurrentPosition, você não receberá de volta um GeolocationCoordinates ou GeolocationPositionError object, então não verifique o seu tipo. No entanto, você ainda pode acessar todas as propriedades esperadas.
  • Se algumas propriedades não são suportadas pelo dispositivo, por exemplo GeolocationCoordinates.altitudeAccuracy, um navegador normalmente retornaria nulo, enquanto nós poderíamos retornar 0, já que é isso que obtemos do dispositivo.