Jak pobrać lokalizację użytkownika

Opublikowano 24. stycznia 2023 przez Jan Bunk


Nasze aplikacje modyfikują API JavaScript navigator.geolocation, aby dać Ci jak najwięcej możliwości programistycznych i zapewnić użytkownikom aplikacji najlepsze doświadczenie.

Możesz używać funkcji geolokalizacji JavaScript jak zwykle, o ile pamiętasz o ograniczeniach opisanych na tej stronie.

Dodatkowe funkcje

openAppLocationSettings

Ta funkcja otwiera ekran informacji o aplikacji na Androidzie i ustawienia aplikacji na iOS, gdzie użytkownik może włączyć dostęp do lokalizacji dla aplikacji, nawet jeśli wcześniej odrzucił prośby o uprawnienia.

Przykład kodu oraz sytuację, kiedy warto wywołać tę funkcję, znajdziesz w sekcji obsługi błędów poniżej.

Możesz nasłuchiwać zdarzenia appResumed aby wykryć, kiedy użytkownik wrócił z ustawień.

openDeviceLocationSettings

Ta funkcja otwiera aplikację ustawień na Androidzie, gdzie użytkownik może włączyć usługi lokalizacji. Na iOS również otwiera aplikację ustawień, ale z powodu ograniczeń technicznych nie na dokładnej stronie zarządzania lokalizacją.

Przykład kodu oraz sytuację, kiedy warto wywołać tę funkcję, znajdziesz w sekcji obsługi błędów poniżej.

Możesz nasłuchiwać zdarzenia appResumed aby wykryć, kiedy użytkownik wrócił z ustawień.

Obsługa błędów

Podczas pobierania bieżącej lokalizacji może wystąpić kilka potencjalnych błędów. Zachowujemy zgodność z oryginalnym API geolokalizacji, ale dostarczamy też dodatkowe informacje o tym, co dokładnie poszło nie tak.


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

Ograniczenia

  • Gdy wywołasz navigator.geolocation.getCurrentPosition, nie otrzymasz obiektu GeolocationCoordinates ani GeolocationPositionError, więc nie sprawdzaj jego typu. Nadal możesz uzyskać dostęp do wszystkich oczekiwanych właściwości.
  • Jeśli niektóre właściwości nie są obsługiwane przez urządzenie, np. GeolocationCoordinates.altitudeAccuracy, przeglądarka zwykle zwraca null, a my możemy zwrócić 0, bo taką wartość dostajemy z urządzenia.