GPS і служби геолокації в мобільних додатках — це API для визначення фізичного місцезнаходження пристрою за допомогою супутників, Wi-Fi та мобільних мереж. За даними Google Android Location Guide (2025), понад 60% мобільних додатків використовують дані про місцезнаходження для персоналізації контенту. Fused Location Provider на Android об’єднує кілька джерел для підвищення точності та зниження енергоспоживання.
Головне
GPS (Global Positioning System) — це супутникова система навігації, що складається з 31 активного супутника на орбіті висотою приблизно 20 200 км. На мобільних пристроях GPS-чіп приймає сигнали від супутників і обчислює координати на основі трилатерації — вимірювання часу проходження сигналу від кількох супутників. Служби геолокації в мобільних ОС додають до GPS дані від Wi-Fi точок доступу та стільникових вишок для прискорення визначення координат (A-GPS) і покращення точності всередині приміщень. За даними GPS.gov (2024), точність цивільного GPS становить 3-5 метрів при ясному небі та до 15 метрів в умовах щільної забудови.
Сучасні мобільні пристрої підтримують не лише американську систему GPS, але й інші глобальні навігаційні супутникові системи: російську ГЛОНАСС (24 супутники), європейську Galileo (28 супутників) і китайську BeiDou. Підтримка кількох систем одночасно підвищує точність і швидкість визначення позиції — пристрій може використовувати до 40 супутників різних систем для розрахунку положення. На iOS і Android вибір супутникової системи здійснюється автоматично на рівні апаратного чіпа, розробнику не потрібно керувати цим.
Процес визначення місцезнаходження на мобільному пристрої складається з кількох етапів: збір даних від джерел (супутники, Wi-Fi, соти), фільтрація та корекція помилок, обчислення координат і передача результату додатку. Операційна система керує цим процесом через єдиний сервіс геолокації, який оптимізує роботу всіх джерел для економії заряду батареї. Нижче описано три основні джерела даних про місцезнаходження.
Супутникова навігація забезпечує максимальну точність (3-5 метрів), але вимагає прямої видимості неба. У приміщенні або щільній міській забудові сигнал GPS може бути ослаблений або повністю втрачений. Час першого визначення позиції (TTFF) становить 30-60 секунд при холодному старті та 5-10 секунд при гарячому. A-GPS (Assisted GPS) прискорює старт за рахунок завантаження ефемерид супутників через інтернет замість очікування даних від супутників.
Wi-Fi позиціонування використовує базу даних MAC-адрес точок доступу з відомими координатами. Точність становить 10-50 метрів у зоні дії Wi-Fi. Стільникові вишки дають точність від 100 метрів до кількох кілометрів залежно від щільності вишок. Комбінація всіх джерел (Fused Location) дозволяє отримувати координати з розумною точністю при мінімальному енергоспоживанні — особливо коли GPS-чіп вимкнено або сигнал супутників недоступний.
На обох платформах служби геолокації реалізовані через системні API з різним ступенем абстракції. Android використовує FusedLocationProviderClient із Google Play Services, iOS — CLLocationManager із Core Location. Обидва API дозволяють запитувати разову позицію або підписуватися на регулярні оновлення. Нижче наведено приклад отримання координат на Android за допомогою Fused Location Provider на Kotlin.
val fusedClient = LocationServices.getFusedLocationProviderClient(this)
val locationRequest = LocationRequest.Builder(
Priority.PRIORITY_HIGH_ACCURACY
)
.setIntervalMillis(5000)
.setMinUpdateIntervalMillis(2000)
.build()
val locationCallback = object : LocationCallback() {
override fun onLocationResult(result: LocationResult) {
result.lastLocation?.let { location ->
Log.d("Місцезнаходження", "Lat: ${location.latitude}, Lng: ${location.longitude}")
}
}
}
if (checkLocationPermission()) {
fusedClient.requestLocationUpdates(
locationRequest, locationCallback,
Looper.getMainLooper()
)
}
У прикладі LocationRequest налаштовується з пріоритетом HIGH_ACCURACY — це вмикає GPS для максимальної точності. setIntervalMillis задає бажаний інтервал оновлення (5 секунд), setMinUpdateIntervalMillis — мінімальний (2 секунди). Callback onLocationResult викликається щоразу, коли система отримує нові координати. Важливо перевіряти дозвіл перед викликом requestLocationUpdates — інакше додаток впаде з SecurityException.
import CoreLocation
let locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()
// МІТКА: - CLLocationManagerDelegate
func locationManager(
_ manager: CLLocationManager,
didUpdateLocations locations: [CLLocation]
) {
guard let location = locations.last else { return }
print("Location: \(location.coordinate.latitude), \(location.coordinate.longitude)")
}
На iOS desiredAccuracy визначає точність запиту: kCLLocationAccuracyBest використовує всі доступні джерела (GPS + Wi-Fi + соти). Після запиту дозволу через requestWhenInUseAuthorization система показує діалог користувачеві. Делегат didUpdateLocations отримує масив CLLocation об’єктів з координатами, висотою, швидкістю та курсом. Для зупинки оновлень викликається stopUpdatingLocation, щоб заощадити заряд батареї.
Доступ до геолокації вимагає явного дозволу користувача на обох платформах. На Android використовуються дозволи ACCESS_FINE_LOCATION (GPS) і ACCESS_COARSE_LOCATION (Wi-Fi/соти). Починаючи з Android 10, для фонового доступу потрібен окремий дозвіл ACCESS_BACKGROUND_LOCATION. На iOS доступні три рівні: requestWhenInUseAuthorization (тільки при активному додатку), requestAlwaysAuthorization (у фоні) та тимчасові мітки для точного позиціонування. Apple вимагає обов’язкового опису в Info.plist: NSLocationWhenInUseUsageDescription або NSLocationAlwaysAndWhenInUseUsageDescription. Без цих ключів запит дозволу ігнорується.
Постійне використання GPS значно знижує заряд батареї — до 30% за годину безперервної роботи на максимальній точності. Для оптимізації енергоспоживання рекомендується використовувати геолокацію лише тоді, коли це необхідно, і припиняти оновлення при переході додатка у фон. На Android FusedLocationProviderClient автоматично перемикається між GPS і мережевими джерелами залежно від доступності та пріоритету запиту. На iOS використовуйте significant-change location service (startMonitoringSignificantLocationChanges) для оновлень з мінімальним енергоспоживанням — точність нижча (до 500 метрів), але батарея майже не витрачається. Також практикуйте пакетну обробку: збирайте координати з інтервалом 5-10 хвилин і надсилайте на сервер одним запитом через WorkManager на Android або BGTaskScheduler на iOS. Зниження частоти запитів з 1 секунди до 30 секунд зменшує енергоспоживання геолокації на 85%.
Геолокація застосовується в широкому спектрі мобільних додатків: від навігаторів до сервісів доставки. Найбільш поширені сценарії включають відображення користувача на карті, геотаргетинг реклами, відстеження кур’єрів, геозони для push-повідомлень і трекінг фітнес-активності. Кожен сценарій вимагає свого підходу до точності та періодичності оновлень. Нижче наведено таблицю з рекомендаціями щодо налаштування для різних типів додатків.
| Тип додатку | Точність | Інтервал | Фоновий режим |
|---|---|---|---|
| Навігатор | HIGH (GPS) | 1-2 сек | Так |
| Доставка | BALANCED (GPS+Wi-Fi) | 10-30 сек | Так |
| Погода | LOW (Wi-Fi/соти) | Одноразово | Ні |
| Соцмережа | BALANCED | При відкритті | Ні |
| Фітнес | HIGH (GPS) | 5-10 сек | Так |
При проектуванні геолокаційного функціоналу важливо враховувати, що користувачі можуть відкликати дозвіл у будь-який момент через налаштування системи. Додаток повинен коректно обробляти ситуацію, коли геолокація недоступна, і показувати зрозуміле пояснення, чому функціонал обмежений.
Geofencing — технологія створення віртуальних кордонів на карті, при перетині яких додаток отримує повідомлення. На Android геозони реалізуються через GeofencingClient із Google Play Services, на iOS — через CLCircularRegion із Core Location. При вході або виході із зони система пробуджує додаток і надсилає подію навіть якщо додаток закрито або згорнуто. Це використовується для push-повідомлень при наближенні до магазину, нагадувань про завдання за геопозицією та автоматизації IoT-пристроїв. Максимальна кількість геозон обмежена: на Android — 100, на iOS — 20 одночасно. Мінімальний радіус зони — 50 метрів на обох платформах, інакше система може не спрацювати через похибку визначення місцезнаходження. При вході в зону система запускає Intent на Android або викликає делегат locationManager:didEnterRegion на iOS.
Часті запитання
GPS у смартфоні — це вбудований приймач сигналів супутникової системи навігації, що визначає координати з точністю до 3-5 метрів. На пристроях також доступні ГЛОНАСС, Galileo і BeiDou для підвищення точності та швидкості позиціонування.
GPS — це лише супутниковий метод визначення координат. Служби геолокації об’єднують GPS, Wi-Fi позиціонування та дані стільникових вишок для більш швидкого та енергоефективного визначення місцезнаходження, особливо всередині приміщень.
Викличте requestWhenInUseAuthorization() або requestAlwaysAuthorization() на екземплярі CLLocationManager. Попередньо додайте NSLocationWhenInUseUsageDescription у Info.plist із зрозумілим текстом причини використання геолокації.
Використовуйте FusedLocationProviderClient на Android і significant-change location service на iOS. Збільшіть інтервал між запитами до 10-30 секунд, відключайте оновлення коли екран вимкнено та застосовуйте пакетне надсилання координат на сервер.
Так, без GPS можна визначити приблизне місцезнаходження за Wi-Fi точками доступу (точність 10-50 метрів) або за вишками стільникового зв’язку (точність 100-5000 метрів). На Android для цього використовується ACCESS_COARSE_LOCATION.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також