Реалізація відстеження місцезнаходження дитини через мобільний додаток
GPS-трекінг дитини — задача, яка виглядає простою тільки до першого продакшн-запуску. «Фоновая геолокація» працює принципово по-різному на iOS та Android, і більшість проблем проявляються не в дев-окруженні, а у реального користувача через два тижні після релізу.
На Android 10+ фоновий доступ до геолокації потребує ACCESS_BACKGROUND_LOCATION — окремого runtime-дозволу, який користувач повинен видати через системні налаштування, а не через стандартний діалог. Google Play з кінця 2020 року потребує обґрунтування для цього дозволу при ревью. На iOS ситуація інша: Always авторизацію можна отримати тільки після того, як користувач спочатку видав WhenInUse, потім окремо згодився на постійний доступ — системний промпт з'являється в потрібний момент тільки при правильно вистроєному флоу запиту.
Де розваливається фоновий трекінг
Батарея проти частоти оновлень
CLLocationManager з desiredAccuracy: kCLLocationAccuracyBest та distanceFilter: kCLDistanceFilterNone — вірний спосіб розрядити iPhone дитини за 4 години. Для дитячого трекера достатньо kCLLocationAccuracyHundredMeters та distanceFilter: 50 (метрів). При русі пішки це дає оновлення кожні 30-60 секунд без помітного впливу на батарею.
Для Android — FusedLocationProviderClient з Google Play Services з LocationRequest.Builder та пріоритетом PRIORITY_BALANCED_POWER_ACCURACY. У поєднанні зі SmallestDisplacement у 30-50 метрів це знижує енергоспоживання в 3-4 рази порівняно з PRIORITY_HIGH_ACCURACY.
iOS: приложение убивает система
Background App Refresh — перше, що iOS вимикає при низькому заряді або в режимі Low Power Mode. CLLocationManager з allowsBackgroundLocationUpdates = true та pausesLocationUpdatesAutomatically = false утримує додаток живим довше, але не вічно. Для гарантованої роботи в фоні потрібна significant location change як fallback: startMonitoringSignificantLocationChanges() просипається при смені вишки сотової зв'язку — 300-500 метрів точність, але працює навіть при suspended-стану додатку.
На Android убійця процесів — Doze mode та виробничі оболонки (MIUI, EMUI, OneUI) з агресивним battery management. Рішення: ForegroundService з постійним уведомленням у статусбарі — саме так працюють Яндекс.Навігатор та Google Maps. Без foreground service у MIUI 14 трекінг засипає через 5-7 хвилин після выключення екрана.
React Native та Flutter: додатковий шар проблем
Якщо додаток кроссплатформенний, react-native-background-geolocation (Transistor Software) — найбільш зріла бібліотека, має власний headless mode для Android та коректно обробляє iOS background modes. Альтернатива у Flutter — background_locator_2, хоча її підтримка нестабільна: перевір дату останнього коміту перед інтеграцією. Ми частіше пишемо нативні модулі під iOS та Android окремо та прокидуємо события через EventEmitter / EventChannel — це надійніше для критичного трекінгу.
Архітектура передачі координат
Координати не стоїть відправляти кожне оновлення безпосередньо на backend. Правильна схема:
- Накопичувати точки локально в SQLite / Room (Android) або Core Data (iOS)
- Відправляти батчами кожні 30-60 секунд або по накопленню N точок
- На сервері зберігати last_known_location окремо від треку — для швидкої відповіді на запит «де зараз»
WebSocket підходить для real-time відображення на карті батька, але утримувати постійне з'єднання в фоні на iOS неможливо без VoIP push trick (сіра зона App Store політики). Практичніше: додаток дитини пушит через APNs / FCM фонові data-push, додаток батька отримує їх та оновлює UI.
Дозволи та App Store / Google Play
На iOS потрібні ключі в Info.plist: NSLocationAlwaysAndWhenInUseUsageDescription, NSLocationWhenInUseUsageDescription. Без зрозумілого тексту (не «для роботи додатку») ревьюери Apple відхиляють по guideline 5.1.1. Опис повинен явно пояснювати, чому саме потрібна фонова геолокація.
Google Play потребує Privacy Policy з явним згадуванням збору геолокації та форми Declaration для ACCESS_BACKGROUND_LOCATION. Додатки для контролю дітей додатково перевіряються на відповідність Family Policy — потрібна age gate або явне указання, що додаток для батьків, а не дітей.
Стек та етапи роботи
Для нативної iOS — Swift, CoreLocation, MapKit або Google Maps SDK. Для Android — Kotlin, FusedLocationProviderClient, WorkManager для періодичної синхронізації треків. Серверна частина: зберігання координат у PostGIS або TimescaleDB, REST або GraphQL API.
Етапи: аналіз вимог по платформам → проектування схеми зберігання та передачі → нативна реалізація location-модулів → інтеграція з backend → тестування на реальних пристроях (особливо Xiaomi/Huawei/Samsung) → настройка push-уведомлень → ревью та публікація.
Графік: від 3 до 8 тижнів залежно від набору платформ та вимог до точності. Вартість розраховується індивідуально після аналізу вимог.







