Så här gör du: Få fram användarens plats

Postat den 24. januari 2023 av Jan Bunk


Våra appar ändrar navigator.geolocation JavaScript API för att ge dig de bästa utvecklingsmöjligheterna och dina appanvändare den bästa upplevelsen.

Du kan använda JavaScript-funktionerna för geolokalisering som vanligt, så länge du har i åtanke de begränsningar som nämns på den här sidan.

Ytterligare funktioner

openAppLocationSettings

Den här funktionen öppnar appinfoskärmen på Android och appen Inställningar på iOS, där användaren kan aktivera platsåtkomst för appen, även om han eller hon tidigare har avvisat uppmaningarna om tillstånd.

Du kan hitta ett kodprov tillsammans med exempel på när det kan vara klokt att anropa den här funktionen i avsnittet om felhantering nedan.

Du kan lyssna på händelsen appResumed för att upptäcka när användaren återvände från inställningarna.

openDeviceLocationSettings

Den här funktionen öppnar appen Inställningar på Android där användaren kan aktivera lokaliseringstjänster. På iOS öppnar den också inställningsappen, men på grund av tekniska begränsningar inte exakt den sida där lokaliseringstjänsterna hanteras.

Du kan hitta ett kodprov tillsammans med exempel på när det kan vara klokt att anropa den här funktionen i avsnittet om felhantering nedan.

Du kan lyssna på händelsen appResumed för att upptäcka när användaren återvände från inställningarna.

Hantering av fel

Det finns ett par potentiella felkällor när du hämtar den aktuella platsen. Vi behåller kompatibiliteten med det ursprungliga geolokaliserings-API:et men ger också ytterligare information om vad som exakt gick fel.


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

Begränsningar

  • När du anropar navigator.geolocation.getCurrentPosition kommer du inte få tillbaka ett GeolocationCoordinates- eller GeolocationPositionError-objekt, så du behöver inte kontrollera dess typ. Du kan dock fortfarande få tillgång till alla de förväntade egenskaperna.
  • Om vissa egenskaper inte stöds av enheten, t.ex. GeolocationCoordinates.altitudeAccuracy, skulle en webbläsare normalt sett returnera null, medan vi kan returnera 0, eftersom det är vad vi får från enheten.