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-FZ в Русия изискват получаване на информирано съгласие за обработка на данни за местоположение. Приложението трябва не само да поиска разрешение чрез системния диалог, но и да предостави отделно уведомление за целите на събирането на данни. Нарушаването на тези изисквания води до глоби до 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 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също