Location Permission to uprawnienie, które aplikacja mobilna prosi użytkownika o dostęp do danych o jego położeniu geograficznym. Bez tego uprawnienia aplikacja nie może określić współrzędnych urządzenia, a tym samym nie będzie mogła świadczyć funkcji geolokalizacji. Według Apple Developer Documentation, 2024, wszystkie aplikacje korzystające z usług lokalizacyjnych są zobowiązane do żądania wyraźnej zgody użytkownika za pomocą okna systemowego.
Najważniejsze
Location Permission to mechanizm systemu operacyjnego, który reguluje dostęp aplikacji do danych o położeniu geograficznym urządzenia. Bez wyraźnej zgody użytkownika aplikacja nie może uzyskać współrzędnych GPS, danych sieci Wi-Fi ani informacji o stacjach bazowych telefonii komórkowej.
Platformy mobilne Android i iOS implementują własny system uprawnień, ale ogólna logika jest taka sama: aplikacja deklaruje wymagane uprawnienia w manifeście lub pliku konfiguracyjnym, a następnie żąda ich w czasie wykonywania. Według Android Developers, 2024, począwszy od Androida 10 wszystkie uprawnienia do geolokalizacji należą do kategorii niebezpiecznych i wymagają żądania w czasie wykonywania.
Przyczyną takiego podejścia jest ochrona prywatności użytkowników. Dane o lokalizacji umożliwiają tworzenie tras przemieszczania się, określanie miejsc pracy i odpoczynku, a także identyfikację osoby. Dlatego obie platformy wymagają przejrzystego wyjaśnienia w oknie żądania: aplikacja musi podać powód, dla którego potrzebuje dostępu do geolokalizacji.
Uprawnienie do geolokalizacji jest niezbędne dla każdej aplikacji, której funkcjonalność zależy od znajomości fizycznego położenia użytkownika. Mapy i nawigacja, aplikacje dostawy, serwisy pogodowe, sieci społecznościowe z geotagowaniem — wszystkie te kategorie programów wymagają Location Permission.
Bez tego uprawnienia aplikacja nie może określić współrzędnych urządzenia żadnym z dostępnych sposobów: ani przez moduł GPS, ani przez skanowanie Wi-Fi, ani przez określenie położenia na podstawie stacji bazowych telefonii komórkowej. Użytkownik może w każdej chwili cofnąć uprawnienie w ustawieniach systemowych, po czym aplikacja musi poprawnie obsłużyć odmowę.
Według badań Pew Research Center (2024), około 45% użytkowników cofa dostęp do geolokalizacji w aplikacjach, które nie wykorzystują jej do głównego funkcjonowania. Oznacza to, że programista musi jasno uzasadnić żądanie i zaproponować alternatywne mechanizmy dla tych, którzy odmówili Location Permission.
RODO w Europie oraz ustawa 152-FZ w Rosji wymagają uzyskania świadomej zgody na przetwarzanie danych o lokalizacji. Aplikacja musi nie tylko poprosić o uprawnienie przez okno systemowe, ale także przedstawić oddzielne powiadomienie o celach zbierania danych. Naruszenie tych wymogów grozi karami do 20 milionów euro lub 4% rocznego obrotu firmy.
Jeśli aplikacja nie żąda Location Permission lub użytkownik odmawia dostępu, programista musi przewidzieć scenariusz zapasowy. Dla aplikacji mapowej może to być ręczne wprowadzenie adresu, dla aplikacji dostawy — wybór z listy zapisanych adresów, dla serwisu pogodowego — określenie miasta na podstawie adresu IP. Graceful degradation (łagodna degradacja) to standardowa praktyka zalecana przez Google i Apple.
Poziomy dostępu do geolokalizacji różnią się na Android i iOS, choć ogólna idea jest taka sama: im dokładniejszy dostęp, tym bardziej rygorystyczne wymagania platforma stawia aplikacji.
| Poziom dostępu | Android | iOS |
|---|---|---|
| Podczas użytkowania | Tylko gdy aplikacja jest aktywna | When In Use — tylko w aplikacji |
| W tle | Always — stale, nawet w tle | Always — wymaga dodatkowej weryfikacji App Store |
| Przybliżony | ACCESS_COARSE_LOCATION (dokładność do 500 m) | Z opcją Precision = Off (iOS 14+) |
ACCESS_FINE_LOCATION zapewnia dostęp do dokładnych współrzędnych GPS z błędem do kilku metrów. Do zadeklarowania tego uprawnienia w manifeście używa się stałej android.permission.ACCESS_FINE_LOCATION. ACCESS_COARSE_LOCATION z kolei zapewnia przybliżoną lokalizację z dokładnością do 500 metrów na podstawie danych Wi-Fi i stacji bazowych.
When In Use (podczas użytkowania) pozwala aplikacji uzyskiwać współrzędne tylko wtedy, gdy jest otwarta na ekranie. Always (zawsze) daje dostęp do geolokalizacji nawet w tle, ale wymaga obowiązkowego przejścia recenzji w App Store. Począwszy od iOS 14, użytkownik może osobno wyłączyć dokładne pozycjonowanie dla każdej aplikacji za pomocą przełącznika Precision.
Żądanie Location Permission na Android odbywa się w dwóch etapach: deklaracja uprawnień w manifeście i żądanie w czasie wykonywania w kodzie. Począwszy od Androida 6.0 (API 23), wszystkie niebezpieczne uprawnienia są żądane podczas działania aplikacji, a nie podczas instalacji.
Pierwszym krokiem jest dodanie niezbędnych uprawnień do pliku AndroidManifest.xml. Do dokładnego i przybliżonego pozycjonowania używane są różne stałe.
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
Po deklaracji w manifeście należy wywołać systemowe okno żądania uprawnienia w kodzie aplikacji. Rozważmy przykład w Kotlin z użyciem Activity Result API.
private val locationPermissionRequest =
registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions ->
when {
permissions.getOrDefault(Manifest.permission.ACCESS_FINE_LOCATION, false) -> {
// Uprawnienie przyznane
getLocation()
}
permissions.getOrDefault(Manifest.permission.ACCESS_COARSE_LOCATION, false) -> {
// Tylko przybliżona lokalizacja
getCoarseLocation()
}
else -> {
// Użytkownik odmówił
showLocationExplanation()
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
checkLocationPermission()
}
Jeśli użytkownik odmówił dostępu, system Android nie pozwala automatycznie ponownie wyświetlić okna. Programista musi wywołać shouldShowRequestPermissionRationale w celu wyświetlenia wstępnego wyjaśnienia. W przypadku ponownej odmowy z flagą Never Ask Again należy przekierować użytkownika do ustawień systemowych.
private fun checkLocationPermission() {
when {
ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) ==
PackageManager.PERMISSION_GRANTED -> {
getLocation()
}
ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.ACCESS_FINE_LOCATION) -> {
showRationaleDialog {
requestLocationPermission()
}
}
else -> {
openAppSettings()
}
}
}
Żądanie Location Permission na iOS wymaga dodania specjalnych kluczy do pliku Info.plist i wywołania metody klasy CLLocationManager. Apple przywiązuje szczególną wagę do prywatności, dlatego tekst wyjaśnienia w oknie żądania musi być jak najbardziej konkretny.
Aby zażądać lokalizacji na iOS, należy dodać jeden lub oba klucze w Info.plist: NSLocationWhenInUseUsageDescription dla dostępu podczas użytkowania i NSLocationAlwaysAndWhenInUseUsageDescription dla dostępu w tle. Wartością każdego klucza jest ciąg znaków, który zostanie wyświetlony użytkownikowi w oknie.
<key>NSLocationWhenInUseUsageDescription</key>
<string>Aplikacja potrzebuje Twojej lokalizacji, aby wyświetlić najbliższe punkty na mapie.</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Aplikacja potrzebuje dostępu do geolokalizacji w tle do śledzenia trasy.</string>
W kodzie Swift żądanie odbywa się za pomocą instancji CLLocationManager. W zależności od wymaganego poziomu dostępu wywoływana jest metoda requestWhenInUseAuthorization lub requestAlwaysAuthorization.
import CoreLocation
class LocationManager: NSObject, CLLocationManagerDelegate {
private let manager = CLLocationManager()
func requestLocationAccess() {
manager.delegate = self
manager.requestWhenInUseAuthorization()
}
func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
switch manager.authorizationStatus {
case .authorizedWhenInUse, .authorizedAlways:
startLocationUpdates()
case .denied, .restricted:
showSettingsAlert()
case .notDetermined:
break
}
}
}
W przeciwieństwie do Androida, iOS nie udostępnia programiście metody do sprawdzenia shouldShowRequestPermissionRationale. System sam decyduje, kiedy wyświetlić wyjaśnienie. Ponadto na iOS użytkownik może zmienić uprawnienie tylko przez ustawienia systemowe — aplikacja nie może ponownie wywołać okna systemowego po tym, jak użytkownik dokonał wyboru. RequestAlwaysAuthorization najpierw żąda When In Use, a następnie, po uzyskaniu pierwszej zgody, osobne okno na dostęp w tle.
Najlepsze praktyki pracy z Location Permission pomagają zmniejszyć liczbę odmów użytkowników i spełniać wymagania sklepów z aplikacjami. Google i Apple opublikowały zalecenia, których przestrzeganie zwiększa szanse na zatwierdzenie aplikacji.
Nie wyświetlaj okna żądania Location Permission natychmiast po uruchomieniu aplikacji. Użytkownik, który właśnie otworzył aplikację, jeszcze nie rozumie, po co ma udostępniać geolokalizację. Contextual request zakłada, że okno pojawia się w momencie, gdy użytkownik naprawdę potrzebuje funkcji wymagającej uprawnienia. Na przykład po naciśnięciu przycisku „Znajdź najbliższy sklep”.
Przed oknem systemowym pokaż własny ekran wyjaśnienia (pre-permission screen). Opowiedz na nim, po co aplikacji geolokalizacja, jakie dane są zbierane i jak będą wykorzystywane. Gdy użytkownik kliknie „Zezwól” na Twoim ekranie, pokaż okno systemowe. Według danych Appsflyer (2024), takie podejście zwiększa konwersję zgody o 25-35%.
Dostęp w tle do geolokalizacji jest potrzebny tylko aplikacjom działającym w tle: nawigatorom, trackerom aktywności, aplikacjom dostawy. Jeśli Twoja aplikacja potrzebuje współrzędnych tylko przy otwartym ekranie, żądaj When In Use. App Store odrzuci aplikację, jeśli Always nie jest uzasadnione funkcjonalnie. Na Android dostęp w tle jest dodatkowo regulowany przez uprawnienie ACCESS_BACKGROUND_LOCATION.
Często zadawane pytania
Aplikacja musi poprawnie obsłużyć odmowę i zaproponować alternatywny scenariusz. Na przykład ręczne wprowadzenie adresu lub określenie miasta na podstawie adresu IP. Okno systemowe nie jest ponownie wyświetlane — należy przekierować użytkownika do ustawień.
Technicznie tak, okno systemowe można wywołać bez ekranu wstępnego. Jednak konwersja zgody bez wyjaśnienia wynosi 30-40%, podczas gdy z ekranem wstępnym — 60-75%. Apple i Google zalecają zawsze wyjaśniać powód żądania.
Użyj ContextCompat.checkSelfPermission ze stałą Manifest.permission.ACCESS_FINE_LOCATION. Metoda zwraca PERMISSION_GRANTED lub PERMISSION_DENIED, co pozwala określić bieżący status bez wywoływania okna systemowego.
ACCESS_FINE_LOCATION zapewnia dostęp do dokładnych współrzędnych GPS z błędem 3-10 metrów. ACCESS_COARSE_LOCATION zapewnia przybliżoną lokalizację z dokładnością do 500 metrów na podstawie Wi-Fi i stacji bazowych. Na Android 12+ programista może żądać obu uprawnień jednocześnie.
Na Android do skanowania urządzeń BLE wymagane jest ACCESS_FINE_LOCATION lub ACCESS_COARSE_LOCATION, ponieważ sygnały BLE mogą być wykorzystywane do triangulacji położenia. Na iOS do BLE wystarczy uprawnienie Bluetooth, Location Permission nie jest wymagane.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również