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.
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ń.
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);
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.GeolocationCoordinates.altitudeAccuracy
, przeglądarka zwykle zwraca null, a my możemy zwrócić 0, bo taką wartość dostajemy z urządzenia.