Карти та геолокація в мобільних додатках: Google Maps, MapKit, геофенсинг, трекінг
Геолокація в мобільних додатках—це не просто «додати карту». Це робота з дозволами, точністю, енергоспоживанням та поведінкою ОС, яка принципово різниться на iOS та Android. Трекер доставки, програма для бігу, карта магазинів—кожен випадок вимагає різного підходу до того, як та коли запитувати координати.
Дозволи: один з найчастіших джерел поганих відгуків
На iOS дозвіл на геолокацію—найчутливіший після мікрофона та камери. З iOS 14 система показує індикатор у рядку стану при використанні геолокації у фоні—користувачі це помічають. NSLocationWhenInUseUsageDescription та NSLocationAlwaysAndWhenInUseUsageDescription повинні містити чесне пояснення, інакше додаток буде відхилений під час перевірки. Запитання always дозволу під час запуску—гарантований спосіб втратити більшість користувачів. Правильна схема: спочатку whenInUse, потім always тільки коли користувач дійшов до функції, яка його потребує, з поясненням навіщо.
На Android з API 29+ ACCESS_BACKGROUND_LOCATION — окремий дозвіл, який не можна запитати разом із foreground. Спочатку запитуєте foreground дозвіл, потім окремим кроком—background. Google Play вимагає обґрунтування для background location у анкеті при публікації. Якщо обґрунтування слабке—додаток можуть відхилити або потребувати видалення background location.
Точність та енергоспоживання: як не розрядити акумулятор
Постійний GPS на максимальній точності споживає 100–150 мВт—акумулятор розряджається за 4–6 годин. Для більшості завдань це надлишково.
На Android FusedLocationProviderClient (Google Play Services) об'єднує GPS, Wi-Fi та мобільну мережу, вибираючи оптимальне джерело. LocationRequest.Builder з пріоритетами:
-
PRIORITY_HIGH_ACCURACY—GPS включений, для навігації -
PRIORITY_BALANCED_POWER_ACCURACY—точність ~100 метрів, Wi-Fi + мобільна -
PRIORITY_LOW_POWER—точність ~10 км, тільки мобільна -
PRIORITY_PASSIVE—координати від інших додатків, без активного запиту
Для трекера активного бігу—HIGH_ACCURACY з інтервалом 2–5 секунд. Для геофенсинг уведомлень у фоні—PASSIVE або LOW_POWER, система сама пробудить за подією.
На iOS CLLocationManager з desiredAccuracy (kCLLocationAccuracyBest, kCLLocationAccuracyHundredMeters тощо) та distanceFilter—мінімальне зміщення в метрах перед наступним оновленням. Для трекінгу маршруту з економією батареї: desiredAccuracy = kCLLocationAccuracyNearestTenMeters, distanceFilter = 10—отримуємо оновлення тільки при реальному русі.
Significant Location Changes—режим iOS, який працює на рівні ОС без активного GPS: оновлення при зміні мобільної вежі, витрата батареї мінімальна. Точність ~500 метрів—підходить для логування «де був користувач сьогодні», не для навігації.
Google Maps SDK vs MapKit vs Mapbox vs OpenStreetMap
| SDK | Платформа | Офлайн-карти | Кастомний стиль | Без Google Services |
|---|---|---|---|---|
| Google Maps SDK | iOS/Android | Ні (тільки Maps API) | Так (Cloud-based) | Ні |
| MapKit | iOS | Ні | Обмежено | Так |
| Mapbox Maps | iOS/Android | Так | Повністю | Так |
| HERE Maps | iOS/Android | Так | Так | Так |
| OpenStreetMap + MapLibre | iOS/Android/Flutter | Так | Повністю | Так |
Google Maps SDK—вибір за замовчуванням для більшості проектів: звичний UI, хорошої документація, Directions API, Places Autocomplete. Обмеження—залежність від Google Play Services (проблема для Huawei) та цінова політика при високих обсягах запитів.
Mapbox бажаний, коли потрібен кастомний стиль карти (корпоративний брендинг, темна тема), офлайн-карти для роботи без мережі, або доступність на пристроях без GMS. MapboxNavigation SDK—повнофункціональна навігація з голосовими інструкціями, перепрокладкою маршруту, lane guidance.
Для Flutter—google_maps_flutter (офіційний), flutter_map (OpenStreetMap + MapLibre, повністю open-source), mapbox_maps_flutter (офіційний Mapbox SDK з 2023 року).
Геофенсинг: сповіщення за зоною
Геофенсинг—запуск події при вході/виході з географічної зони (коло заданого радіусу).
На Android—GeofencingClient із Google Location Services. Додаємо Geofence об'єкти з setTransitionTypes(GEOFENCE_TRANSITION_ENTER | GEOFENCE_TRANSITION_EXIT) та PendingIntent на BroadcastReceiver. Обмеження: максимум 100 активних геофенсів на додаток, мінімальний радіус ~150 метрів (насправді через точність), спрацювання з затримкою до кількох хвилин для економії батареї.
На iOS—CLCircularRegion + CLLocationManager.startMonitoring(for:). Ліміт: 20 регіонів на додаток. ОС керує коли перевіряти—розробник не контролює затримку. Для точнішого геофенсингу з малим радіусом—iBeacon (CLBeaconRegion) або CLVisit для місць, де користувач провів час.
Якщо потрібно більше 20 (iOS) або 100 (Android) зон—потрібна серверна логіка: періодично відправляємо координати на сервер, сервер перевіряє попадання в зони та відправляє push. Менш точно за часом, але масштабується на тисячи зон.
Трекінг маршрутів та фонова геолокація
Трекінг маршруту бігу або маршруту кур'єра у фоні—технічно різні завдання.
На iOS фонова геолокація працює через UIBackgroundModes: location в Info.plist. Без цього ключа при переході додатку у фон CLLocationManager отримує кілька хвилин та засинає. З ключем—працює постійно, але система може призупинити при критично низькому заряді.
Для трекера бігу на iOS паттерн: startUpdatingLocation при старті тренування, координати пишемо в Core Data кожні 5 секунд, на паузі—stopUpdatingLocation, але залишаємо startMonitoringSignificantLocationChanges щоб додаток не «заблудився» зовсім.
На Android для трекінгу кур'єра потрібен Foreground Service з FOREGROUND_SERVICE_TYPE_LOCATION (обов'язково з API 29). Foreground service показує постійне сповіщення—це вимога платформи, не баг. Без нього Android Doze вбиває оновлення геолокації. WorkManager для фонових завдань тут не підходить—не гарантує безперервність.
Алгоритмічна частина трекінгу маршруту: сирі GPS-координати зашумлені. Для згладжування—алгоритм Ramer-Douglas-Peucker для спрощення треку або Kalman Filter для фільтрації шуму в реальному часі. Без фільтрації трек виглядає як випадкові зигзаги, а розраховується відстань на 20–30% більше за реальну.
Обсяг та графік робіт
Базова інтеграція карти з маркерами та пошуком адрес—1–2 тижні. Геофенсинг з push-сповіщеннями—2–3 тижні з урахуванням тестування на реальних пристроях (емулятор погано імітує затримки геофенсингу). Повнофункціональний трекінг маршрутів з фоновим режимом, згладжуванням та синхронізацією серверу—4–6 тижнів.







