Location Permission је дозвола коју мобилна апликација тражи од корисника за приступ подацима о његовој географској локацији. Без ове дозволе апликација не може да одређује координате уређаја, а самим тим не може да пружа функције геолокације. Према Apple Developer Documentation, 2024, све апликације које користе услуге геолокације обавезне су да затраже изричиту сагласност корисника кроз системски дијалог.
Главно
Location Permission је механизам оперативног система који регулише приступ апликација подацима о географској локацији уређаја. Без изричите сагласности корисника, апликација не може да добије GPS координате, податке о Wi-Fi мрежама или информације о мобилним базним станицама.
Мобилне платформе Android и iOS имплементирају сопствени систем дозвола, али је општа логика иста: апликација декларише потребне дозволе у манифесту или конфигурационом фајлу, затим их тражи у радном времену. Према Android Developers, 2024, од Android-а 10 све дозволе за геолокацију спадају у категорију опасних и захтевају захтев у радном времену.
Разлог оваквог приступа је заштита приватности корисника. Подаци о локацији омогућавају креирање рута кретања, одређивање места рада и одмора, као и идентификацију личности. Због тога обе платформе захтевају транспарентно објашњење у дијалогу захтева: апликација мора да наведе разлог због којег јој је потребан приступ геолокацији.
Дозвола за геолокацију је неопходна за сваку апликацију чија функционалност зависи од познавања физичке локације корисника. Мапе и навигација, апликације за доставу, временске услуге, друштвене мреже са геоозначавањем — све ове категорије програма захтевају Location Permission.
Без ове дозволе апликација не може да одреди координате уређаја ни једним од доступних начина: ни преко GPS модула, ни преко Wi-Fi скенирања, ни преко одређивања локације на основу мобилних базних станица. Корисник може у било ком тренутку да опозове дозволу у системским подешавањима, након чега апликација мора правилно да обради одбијање.
Према истраживању Pew Research Center (2024), око 45% корисника опозива приступ геолокацији у апликацијама које је не користе за основни функционалност. То значи да програмер мора јасно да образложи захтев и понуди алтернативне механизме за оне који су одбили Location Permission.
GDPR у Европи и закон 152-ФЗ у Русији захтевају добијање информисане сагласности за обраду података о локацији. Апликација не само да мора да затражи дозволу кроз системски дијалог, већ и да пружи посебно обавештење о сврхама прикупљања података. Кршење ових захтева повлачи казне до 20 милиона евра или 4% годишњег промета компаније.
Ако апликација не тражи Location Permission или корисник одбије приступ, програмер мора да предвиди резервни сценарио. За мапирајућу апликацију то може бити ручни унос адресе, за апликацију за доставу — избор са листе сачуваних адреса, за временску услугу — одређивање града на основу IP адресе. Graceful degradation (блага деградација) је стандардна пракса коју препоручују Google и Apple.
Нивои приступа геолокацији се разликују на Android-у и iOS-у, иако је општа идеја иста: што је приступ прецизнији, то платформа поставља строже захтеве апликацији.
| Ниво приступа | Android | iOS |
|---|---|---|
| Приликом коришћења | Само када је апликација активна | When In Use — само у апликацији |
| У позадини | Always — стално, чак и у позадини | Always — захтева додатну проверу App Store-а |
| Приближан | ACCESS_COARSE_LOCATION (прецизност до 500 м) | Са опцијом Precision = Off (iOS 14+) |
ACCESS_FINE_LOCATION даје приступ прецизним GPS координатама са грешком до неколико метара. За декларисање ове дозволе у манифесту користи се константа android.permission.ACCESS_FINE_LOCATION. ACCESS_COARSE_LOCATION, заузврат, пружа приближну локацију са прецизношћу до 500 метара на основу Wi-Fi и мобилних базних станица.
When In Use (приликом коришћења) омогућава апликацији да добија координате само када је отворена на екрану. Always (увек) даје приступ геолокацији чак и у позадинском режиму, али захтева обавезну ревизију у App Store-у. Од iOS 14, корисник може посебно да искључи прецизно позиционирање за сваку апликацију преко прекидача Precision.
Захтев за Location Permission на Android-у се изводи у две фазе: декларисање дозвола у манифесту и захтев у радном времену у коду. Од Android 6.0 (API 23), све опасне дозволе се траже током рада апликације, а не приликом инсталације.
Први корак је додавање потребних дозвола у датотеку AndroidManifest.xml. За прецизно и приближно позиционирање користе се различите константе.
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
Након декларисања у манифесту, потребно је позвати системски дијалог захтева за дозволу у коду апликације. Погледајмо пример на Kotlin-у коришћењем Activity Result API-ја.
private val locationPermissionRequest =
registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions ->
when {
permissions.getOrDefault(Manifest.permission.ACCESS_FINE_LOCATION, false) -> {
// Дозвола је добијена
getLocation()
}
permissions.getOrDefault(Manifest.permission.ACCESS_COARSE_LOCATION, false) -> {
// Само приближна локација
getCoarseLocation()
}
else -> {
// Корисник је одбио
showLocationExplanation()
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
checkLocationPermission()
}
Ако је корисник одбио приступ, систем Android не дозвољава поновно аутоматско приказивање дијалога. Програмер мора да позове shouldShowRequestPermissionRationale за приказ претходног објашњења. При поновном одбијању са заставицом Never Ask Again потребно је преусмерити корисника у системска подешавања.
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()
}
}
}
Захтев за Location Permission на iOS-у захтева додавање посебних кључева у датотеку Info.plist и позивање методе класе CLLocationManager. Apple посебну пажњу посвећује приватности, стога текст објашњења у дијалогу захтева мора бити што конкретнији.
За захтев локације на iOS-у потребно је додати један или оба кључа у Info.plist: NSLocationWhenInUseUsageDescription за приступ приликом коришћења и NSLocationAlwaysAndWhenInUseUsageDescription за приступ у позадини. Вредност сваког кључа је низ знакова који ће бити приказан кориснику у дијалогу.
<key>NSLocationWhenInUseUsageDescription</key>
<string>Апликацији је потребна ваша локација за приказ најближих тачака на мапи.</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Апликацији је потребан приступ геолокацији у позадини за праћење руте.</string>
У Swift коду, захтев се изводи преко инстанце CLLocationManager. У зависности од потребног нивоа приступа, позива се requestWhenInUseAuthorization или 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
}
}
}
За разлику од Android-а, iOS не пружа програмеру метод за проверу shouldShowRequestPermissionRationale. Систем сам одлучује када да прикаже објашњење. Поред тога, на iOS-у корисник може да промени дозволу само кроз системска подешавања — апликација не може поново да позове системски дијалог након што је корисник направио избор. RequestAlwaysAuthorization прво тражи When In Use, а затим, након добијања прве сагласности, засебан дијалог за приступ у позадини.
Најбоље праксе рада са Location Permission-ом помажу да се смање одбијања корисника и испуне захтеви продавница апликација. Google и Apple су објавили препоруке чије поштовање повећава вероватноћу одобравања апликације.
Не приказујте дијалог захтева за Location Permission одмах при покретању апликације. Корисник који је управо отворио апликацију још не разуме зашто треба да пружи приступ геолокацији. Contextual request подразумева да се дијалог појављује у тренутку када је кориснику заиста потребна функција која захтева дозволу. На пример, при притиску на дугме „Пронађи најближу продавницу”.
Пре системског дијалога прикажите сопствени екран објашњења (pre-permission screen). На њему објасните зашто је апликацији потребна геолокација, који подаци се прикупљају и како ће бити коришћени. Након што корисник кликне „Дозволи” на вашем екрану, прикажите системски дијалог. Према подацима Appsflyer (2024), овај приступ повећава конверзију сагласности за 25-35%.
Позадински приступ геолокацији је потребан само апликацијама које раде у позадини: навигаторима, тракерима активности, апликацијама за доставу. Ако вашој апликацији требају координате само када је екран отворен, затражите When In Use. App Store ће одбити апликацију ако Always није функционално оправдано. На Android-у, позадински приступ се додатно регулише кроз дозволу ACCESS_BACKGROUND_LOCATION.
Често постављана питања
Апликација мора правилно да обради одбијање и понуди алтернативни сценарио. На пример, ручни унос адресе или одређивање града на основу IP адресе. Системски дијалог се поново не приказује — потребно је преусмерити корисника у подешавања.
Технички да, системски дијалог се може позвати без претходног екрана. Међутим, конверзија сагласности без објашњења износи 30-40%, док са претходним екраном износи 60-75%. Apple и Google препоручују увек објаснити разлог захтева.
Користите ContextCompat.checkSelfPermission са константом Manifest.permission.ACCESS_FINE_LOCATION. Метода враћа PERMISSION_GRANTED или PERMISSION_DENIED, што омогућава одређивање тренутног статуса без позивања системског дијалога.
ACCESS_FINE_LOCATION даје приступ прецизним GPS координатама са грешком од 3-10 метара. ACCESS_COARSE_LOCATION пружа приближну локацију са прецизношћу до 500 метара на основу Wi-Fi и мобилних базних станица. На Android 12+, програмер може да затражи обе дозволе истовремено.
На Android-у за скенирање BLE уређаја потребан је ACCESS_FINE_LOCATION или ACCESS_COARSE_LOCATION, јер BLE сигнали могу да се користе за триангулацију положаја. На iOS-у за BLE је довољна Bluetooth дозвола, Location Permission није потребан.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође