Location Permission este permisiunea pe care o aplicație mobilă o solicită utilizatorului pentru a accesa datele despre poziția sa geografică. Fără această permisiune, aplicația nu poate determina coordonatele dispozitivului și, prin urmare, nu poate oferi funcții de geolocalizare. Potrivit Apple Developer Documentation, 2024, toate aplicațiile care utilizează servicii de localizare sunt obligate să solicite consimțământul explicit al utilizatorului printr-un dialog de sistem.
Principalele aspecte
Location Permission este un mecanism al sistemului de operare care reglementează accesul aplicațiilor la datele despre poziția geografică a dispozitivului. Fără consimțământul explicit al utilizatorului, aplicația nu poate obține coordonate GPS, date despre rețelele Wi-Fi sau informații despre turnurile de telefonie mobilă.
Platformele mobile Android și iOS implementează propriul sistem de permisiuni, dar logica generală este aceeași: aplicația declară permisiunile necesare în manifest sau fișierul de configurare, apoi le solicită în timpul execuției. Potrivit Android Developers, 2024, începând cu Android 10, toate permisiunile de geolocalizare aparțin categoriei periculoase și necesită solicitare în timpul execuției.
Motivul acestei abordări este protejarea confidențialității utilizatorilor. Datele de localizare permit construirea rutelor de deplasare, determinarea locurilor de muncă și odihnă, precum și identificarea persoanei. De aceea, ambele platforme necesită o explicație transparentă în dialogul de solicitare: aplicația trebuie să indice motivul pentru care are nevoie de acces la geolocalizare.
Permisiunea de geolocalizare este necesară pentru orice aplicație a cărei funcționalitate depinde de cunoașterea poziției fizice a utilizatorului. Hărți și navigație, aplicații de livrare, servicii meteo, rețele sociale cu geoetichetare — toate aceste categorii de programe necesită Location Permission.
Fără această permisiune, aplicația nu poate determina coordonatele dispozitivului prin niciuna dintre metodele disponibile: nici prin modulul GPS, nici prin scanarea Wi-Fi, nici prin determinarea poziției pe baza turnurilor de telefonie mobilă. Utilizatorul poate oricând retrage permisiunea în setările de sistem, după care aplicația trebuie să gestioneze corect refuzul.
Potrivit cercetării Pew Research Center (2024), aproximativ 45% dintre utilizatori retrag accesul la geolocalizare în aplicațiile care nu o folosesc pentru funcționalitatea principală. Aceasta înseamnă că dezvoltatorul trebuie să justifice clar solicitarea și să ofere mecanisme alternative pentru cei care au refuzat Location Permission.
GDPR în Europa și legea 152-FZ în Rusia necesită obținerea consimțământului informat pentru prelucrarea datelor de localizare. Aplicația trebuie nu doar să solicite permisiunea prin dialogul de sistem, ci și să ofere o notificare separată despre scopurile colectării datelor. Încălcarea acestor cerințe atrage amenzi de până la 20 de milioane de euro sau 4% din cifra de afaceri anuală a companiei.
Dacă aplicația nu solicită Location Permission sau utilizatorul refuză accesul, dezvoltatorul trebuie să prevadă un scenariu de rezervă. Pentru o aplicație de hărți, aceasta poate fi introducerea manuală a adresei, pentru o aplicație de livrare — selectarea dintr-o listă de adrese salvate, pentru un serviciu meteo — determinarea orașului pe baza adresei IP. Graceful degradation (degradarea elegantă) este o practică standard recomandată de Google și Apple.
Nivelurile de acces la geolocalizare diferă pe Android și iOS, deși ideea generală este aceeași: cu cât accesul este mai precis, cu atât platforma impune cerințe mai stricte aplicației.
| Nivel de acces | Android | iOS |
|---|---|---|
| În timpul utilizării | Doar când aplicația este activă | When In Use — doar în aplicație |
| În fundal | Always — permanent, chiar și în fundal | Always — necesită verificare suplimentară App Store |
| Aproximativ | ACCESS_COARSE_LOCATION (precizie până la 500 m) | Cu opțiunea Precision = Off (iOS 14+) |
ACCESS_FINE_LOCATION oferă acces la coordonate GPS precise cu o eroare de până la câțiva metri. Pentru declararea acestei permisiuni în manifest se utilizează constanta android.permission.ACCESS_FINE_LOCATION. ACCESS_COARSE_LOCATION, la rândul său, oferă o localizare aproximativă cu o precizie de până la 500 de metri pe baza datelor Wi-Fi și a turnurilor de telefonie mobilă.
When In Use (în timpul utilizării) permite aplicației să obțină coordonate doar atunci când este deschisă pe ecran. Always (întotdeauna) oferă acces la geolocalizare chiar și în modul fundal, dar necesită o revizuire obligatorie în App Store. Începând cu iOS 14, utilizatorul poate dezactiva separat poziționarea precisă pentru fiecare aplicație prin comutatorul Precision.
Solicitarea Location Permission pe Android se realizează în două etape: declararea permisiunilor în manifest și solicitarea în timpul execuției în cod. Începând cu Android 6.0 (API 23), toate permisiunile periculoase sunt solicitate în timpul funcționării aplicației, nu la instalare.
Primul pas este adăugarea permisiunilor necesare în fișierul AndroidManifest.xml. Pentru poziționarea precisă și aproximativă se utilizează constante diferite.
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
După declararea în manifest, este necesar să se apeleze dialogul de sistem de solicitare a permisiunii în codul aplicației. Să analizăm un exemplu în Kotlin folosind Activity Result API.
private val locationPermissionRequest =
registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions ->
when {
permissions.getOrDefault(Manifest.permission.ACCESS_FINE_LOCATION, false) -> {
// Permisiune acordată
getLocation()
}
permissions.getOrDefault(Manifest.permission.ACCESS_COARSE_LOCATION, false) -> {
// Doar locație aproximativă
getCoarseLocation()
}
else -> {
// Utilizatorul a refuzat
showLocationExplanation()
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
checkLocationPermission()
}
Dacă utilizatorul a refuzat accesul, sistemul Android nu permite afișarea automată repetată a dialogului. Dezvoltatorul trebuie să apeleze shouldShowRequestPermissionRationale pentru a afișa o explicație preliminară. În cazul unui refuz repetat cu flagul Never Ask Again, utilizatorul trebuie redirecționat către setările de sistem.
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()
}
}
}
Solicitarea Location Permission pe iOS necesită adăugarea unor chei speciale în fișierul Info.plist și apelarea metodei clasei CLLocationManager. Apple acordă o atenție deosebită confidențialității, de aceea textul explicației din dialogul de solicitare trebuie să fie cât mai specific.
Pentru a solicita localizarea pe iOS, trebuie adăugată una sau ambele chei în Info.plist: NSLocationWhenInUseUsageDescription pentru accesul în timpul utilizării și NSLocationAlwaysAndWhenInUseUsageDescription pentru accesul în fundal. Valoarea fiecărei chei este un șir de caractere care va fi afișat utilizatorului în dialog.
<key>NSLocationWhenInUseUsageDescription</key>
<string>Aplicația are nevoie de locația dvs. pentru a afișa cele mai apropiate puncte pe hartă.</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Aplicația are nevoie de acces la geolocalizare în fundal pentru urmărirea rutei.</string>
În codul Swift, solicitarea se realizează printr-o instanță a CLLocationManager. În funcție de nivelul de acces necesar, se apelează requestWhenInUseAuthorization sau 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
}
}
}
Spre deosebire de Android, iOS nu oferă dezvoltatorului o metodă pentru verificarea shouldShowRequestPermissionRationale. Sistemul decide singur când să afișeze explicația. În plus, pe iOS, utilizatorul poate modifica permisiunea doar prin setările de sistem — aplicația nu poate apela din nou dialogul de sistem după ce utilizatorul a făcut o alegere. RequestAlwaysAuthorization solicită mai întâi When In Use, iar apoi, după obținerea primului consimțământ, un dialog separat pentru accesul în fundal.
Cele mai bune practici de lucru cu Location Permission ajută la reducerea refuzurilor utilizatorilor și la îndeplinirea cerințelor magazinelor de aplicații. Google și Apple au publicat recomandări a căror respectare crește probabilitatea de aprobare a aplicației.
Nu afișați dialogul de solicitare a Location Permission imediat la lansarea aplicației. Utilizatorul care tocmai a deschis aplicația încă nu înțelege de ce trebuie să ofere acces la geolocalizare. Contextual request presupune că dialogul apare în momentul în care utilizatorul are cu adevărat nevoie de funcția care necesită permisiunea. De exemplu, la apăsarea butonului „Găsește cel mai apropiat magazin”.
Înainte de dialogul de sistem, afișați propriul ecran de explicație (pre-permission screen). Pe acesta, spuneți de ce aplicația are nevoie de geolocalizare, ce date sunt colectate și cum vor fi utilizate. După ce utilizatorul face clic pe „Permite” pe ecranul dvs., afișați dialogul de sistem. Potrivit datelor Appsflyer (2024), această abordare crește rata de conversie a consimțământului cu 25-35%.
Accesul în fundal la geolocalizare este necesar doar aplicațiilor care funcționează în fundal: navigatoare, trackere de activitate, aplicații de livrare. Dacă aplicația dvs. are nevoie de coordonate doar când ecranul este deschis, solicitați When In Use. App Store va respinge aplicația dacă Always nu este justificat funcțional. Pe Android, accesul în fundal este reglementat suplimentar prin permisiunea ACCESS_BACKGROUND_LOCATION.
Întrebări frecvente
Aplicația trebuie să gestioneze corect refuzul și să ofere un scenariu alternativ. De exemplu, introducerea manuală a adresei sau determinarea orașului pe baza adresei IP. Dialogul de sistem nu se afișează din nou — este necesară redirecționarea utilizatorului către setări.
Tehnic da, dialogul de sistem poate fi apelat fără un ecran preliminar. Cu toate acestea, rata de conversie a consimțământului fără explicație este de 30-40%, în timp ce cu un ecran preliminar este de 60-75%. Apple și Google recomandă întotdeauna explicarea motivului solicitării.
Utilizați ContextCompat.checkSelfPermission cu constanta Manifest.permission.ACCESS_FINE_LOCATION. Metoda returnează PERMISSION_GRANTED sau PERMISSION_DENIED, ceea ce permite determinarea stării curente fără a apela dialogul de sistem.
ACCESS_FINE_LOCATION oferă acces la coordonate GPS precise cu o eroare de 3-10 metri. ACCESS_COARSE_LOCATION oferă o localizare aproximativă cu o precizie de până la 500 de metri pe baza Wi-Fi și a turnurilor de telefonie mobilă. Pe Android 12+, dezvoltatorul poate solicita ambele permisiuni simultan.
Pe Android, pentru scanarea dispozitivelor BLE este necesar ACCESS_FINE_LOCATION sau ACCESS_COARSE_LOCATION, deoarece semnalele BLE pot fi utilizate pentru triangularea poziției. Pe iOS, pentru BLE este suficientă permisiunea Bluetooth, Location Permission nu este necesar.
Concluzii
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și