Реализация отслеживания местоположения ребёнка через мобильное приложение
GPS-трекинг ребёнка — задача, которая выглядит простой только до первого продакшн-запуска. «Фоновая геолокация» работает принципиально по-разному на iOS и Android, и большинство проблем проявляются не в дев-окружении, а у реального пользователя через две недели после релиза.
На Android 10+ фоновый доступ к геолокации требует ACCESS_BACKGROUND_LOCATION — отдельного runtime-разрешения, которое пользователь должен выдать через системные настройки, а не через стандартный диалог. Google Play с конца 2020 года требует обоснования для этого разрешения при ревью. На iOS ситуация иная: Always authorization можно получить только после того, как пользователь сначала выдал 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 недель в зависимости от набора платформ и требований к точности. Стоимость рассчитывается индивидуально после анализа требований.







