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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також