Location Permission в мобильной разработке: что это, типы доступа и принцип работы

Автор: IT Sectr Опубликовано: 2026-05-21 Время чтения: 8 мин

Location Permission — это разрешение, которое мобильное приложение запрашивает у пользователя для доступа к данным о его географическом положении. Без этого разрешения приложение не может определять координаты устройства, а значит не сможет предоставлять функции геолокации. По данным Apple Developer Documentation, 2024, все приложения, использующие службы геолокации, обязаны запрашивать явное согласие пользователя через системный диалог.

Главное

  • Location Permission — обязательное разрешение для доступа к геопозиции устройства в мобильных приложениях.
  • Уровни доступа делятся на фоновый и при использовании приложения на обеих платформах.
  • Android использует ACCESS_FINE_LOCATION и ACCESS_COARSE_LOCATION для точного и приблизительного определения координат.
  • iOS требует добавления ключей NSLocationWhenInUseUsageDescription и NSLocationAlwaysUsageDescription в Info.plist.
  • Запрос разрешения должен содержать понятное объяснение, зачем приложению нужны данные о местоположении.

Что такое Location Permission?

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, хотя общая идея одинакова: чем точнее доступ, тем более строгие требования платформа предъявляет к приложению.

Уровень доступаAndroidiOS
При использованииТолько когда приложение активноWhen In Use — только в приложении
ФоновыйAlways — постоянно, даже в фонеAlways — требуется дополнительная проверка App Store
ПриблизительныйACCESS_COARSE_LOCATION (точность до 500 м)С опцией Precision = Off (iOS 14+)

ACCESS_FINE_LOCATION и ACCESS_COARSE_LOCATION на Android

ACCESS_FINE_LOCATION даёт доступ к точным координатам GPS с погрешностью до нескольких метров. Для объявления этого разрешения в манифесте используется константа android.permission.ACCESS_FINE_LOCATION. ACCESS_COARSE_LOCATION, в свою очередь, предоставляет приблизительное местоположение с точностью до 500 метров на основе данных Wi-Fi и сотовых вышек.

When In Use и Always на iOS

When In Use (при использовании) позволяет приложению получать координаты только когда оно открыто на экране. Always (всегда) даёт доступ к геолокации даже в фоновом режиме, но требует обязательного прохождения ревью в App Store. Начиная с iOS 14, пользователь может отдельно отключать точное позиционирование для каждого приложения через переключатель Precision.

Запрос Location Permission на Android

Запрос Location Permission на Android выполняется в два этапа: объявление разрешений в манифесте и рантайм-запрос в коде. Начиная с Android 6.0 (API 23), все опасные разрешения запрашиваются во время работы приложения, а не при установке.

Объявление в манифесте

Первым шагом необходимо добавить необходимые разрешения в файл AndroidManifest.xml. Для точного и приблизительного позиционирования используются разные константы.

xml
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

Рантайм-запрос на Kotlin

После объявления в манифесте необходимо вызвать системный диалог запроса разрешения в коде приложения. Рассмотрим пример на Kotlin с использованием Activity Result API.

kotlin
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 следует перенаправить пользователя в системные настройки.

kotlin
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

Запрос Location Permission на iOS требует добавления специальных ключей в файл Info.plist и вызова метода класса CLLocationManager. Apple уделяет особое внимание конфиденциальности, поэтому текст объяснения в диалоге запроса должен быть максимально конкретным.

Настройка Info.plist

Для запроса локации на iOS необходимо добавить один или оба ключа в Info.plist: NSLocationWhenInUseUsageDescription для доступа при использовании и NSLocationAlwaysAndWhenInUseUsageDescription для фонового доступа. Значением каждого ключа является строка, которая будет показана пользователю в диалоге.

xml
<key>NSLocationWhenInUseUsageDescription</key>
<string>Приложению нужно ваше местоположение для отображения ближайших точек на карте.</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Приложению нужен доступ к геолокации в фоне для отслеживания маршрута.</string>

Запрос на Swift

В коде Swift запрос выполняется через экземпляр CLLocationManager. В зависимости от нужного уровня доступа вызывается requestWhenInUseAuthorization или requestAlwaysAuthorization.

swift
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 опубликовали рекомендации, соблюдение которых повышает вероятность одобрения приложения.

Запрашивайте permission в контексте

Не показывайте диалог запроса Location Permission сразу при запуске приложения. Пользователь, только что открывший приложение, ещё не понимает, зачем ему предоставлять доступ к геолокации. Contextual request подразумевает, что диалог появляется в тот момент, когда пользователю действительно нужна функция, требующая разрешения. Например, при нажатии на кнопку «Найти ближайший магазин».

Объясняйте причину заранее

Перед системным диалогом покажите собственный экран-объяснение (pre-permission screen). На нём расскажите, зачем приложению геолокация, какие данные собираются и как они будут использоваться. После того как пользователь нажмёт «Разрешить» на вашем экране, покажите системный диалог. По данным Appsflyer (2024), такой подход повышает конверсию одобрения на 25-35%.

Не запрашивайте Always без необходимости

Фоновый доступ к геолокации нужен только приложениям, которые работают в фоне: навигаторам, трекерам активности, приложениям доставки. Если вашему приложению нужны координаты только при открытом экране, запрашивайте When In Use. App Store отклонит приложение, если Always не обосновано функционально. На Android фоновый доступ дополнительно регулируется через разрешение ACCESS_BACKGROUND_LOCATION.

Часто задаваемые вопросы

Что произойдет, если пользователь откажет в Location Permission?

Приложение должно корректно обработать отказ и предложить альтернативный сценарий. Например, ручной ввод адреса или определение города по IP-адресу. Системный диалог повторно не показывается — необходимо перенаправить пользователя в настройки.

Можно ли запрашивать Location Permission без объяснения?

Технически — да, системный диалог можно вызвать без предварительного экрана. Однако конверсия одобрения без объяснения составляет 30-40%, тогда как с предварительным экраном — 60-75%. Apple и Google рекомендуют всегда объяснять причину запроса.

Как проверить статус Location Permission на Android?

Используйте ContextCompat.checkSelfPermission с константой Manifest.permission.ACCESS_FINE_LOCATION. Метод возвращает PERMISSION_GRANTED или PERMISSION_DENIED, что позволяет определить текущий статус без вызова системного диалога.

Чем отличается ACCESS_FINE_LOCATION от ACCESS_COARSE_LOCATION?

ACCESS_FINE_LOCATION даёт доступ к точным координатам GPS с погрешностью 3-10 метров. ACCESS_COARSE_LOCATION предоставляет приблизительное местоположение с точностью до 500 метров на основе Wi-Fi и сотовых вышек. На Android 12+ разработчик может запрашивать оба разрешения одновременно.

Нужно ли Location Permission для BLE-сканеров?

На Android для сканирования BLE-устройств требуется ACCESS_FINE_LOCATION или ACCESS_COARSE_LOCATION, так как BLE-сигналы могут использоваться для триангуляции положения. На iOS для BLE достаточно Bluetooth-разрешения, Location Permission не требуется.

Итоги

  • Location Permission — ключевой механизм защиты конфиденциальности, регулирующий доступ приложений к геопозиции устройства.
  • Уровни доступа включают при использовании (When In Use) и фоновый (Always) на iOS, а также точный (ACCESS_FINE_LOCATION) и приблизительный (ACCESS_COARSE_LOCATION) на Android.
  • Android требует объявления разрешений в манифесте и рантайм-запроса через Activity Result API начиная с API 23.
  • iOS требует добавления ключей в Info.plist и вызова методов CLLocationManager с обязательным указанием причины в тексте запроса.
  • Contextual request — лучшая практика, при которой диалог появляется в момент необходимости, а не при запуске приложения.
  • Pre-permission screen повышает конверсию одобрения на 25-35% по данным Appsflyer (2024).
  • Отказ пользователя требует graceful degradation — альтернативного сценария без использования геолокации.

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также