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 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также