Реализация SOS-кнопки для детского трекера в мобильном приложении
SOS-кнопка в детском трекере — это не просто push-уведомление. Это функция, где сбой или задержка означают реальную опасность. Архитектурные решения здесь принципиально другие, чем в обычных приложениях.
Требования, которые меняют всю архитектуру
Стандартный FCM push может задержаться на минуты в Doze Mode. Для SOS — неприемлемо. Нужна гарантированная доставка с минимальной задержкой и дублирование каналов.
Типичная схема дублирования:
-
FCM high-priority push — основной канал, iOS
criticalуведомление - SMS через Twilio или SMS-шлюз — резервный канал если push не доставлен за 30 секунд
- VoIP-звонок через CallKit (iOS) или InCallService (Android) — финальный резерв
На iOS PushKit + CallKit — это специальный канал для VoIP, работает даже при заблокированном экране и заряде батареи <20%. Приложение регистрирует VoIP push credentials отдельно от обычных APNs.
let voipRegistry = PKPushRegistry(queue: DispatchQueue.main)
voipRegistry.delegate = self
voipRegistry.desiredPushTypes = [.voIP]
Payload VoIP push приходит в pushRegistry(_:didReceiveIncomingPushWith:for:) — здесь нужно немедленно вызвать CXProvider.reportNewIncomingCall(), иначе iOS завершит приложение через несколько секунд.
Детское устройство: как работает SOS
Детский трекер — это либо отдельное устройство (GPS-часы с SIM), либо смартфон ребёнка с приложением в «детском режиме».
Для GPS-часов: устройство отправляет SOS-сигнал через GPRS на сервер (протокол GPRMC или проприетарный TCP-протокол конкретного производителя — GT06, Concox и др.). Сервер парсит пакет, извлекает координаты и статус SOS, формирует алерт.
Для смартфона с приложением: нативная кнопка в интерфейсе (большая, заметная, с подтверждением «Зажмите 3 секунды»). Long press обрабатывается через GestureDetector с onLongPressStart/onLongPressEnd — задержка предотвращает случайные нажатия. После подтверждения: запрос геолокации через geolocator → отправка на сервер → сервер рассылает алерт всем родителям.
Геолокация при SOS
Точность — максимальная. Только GPS, не network location. На Flutter:
final position = await Geolocator.getCurrentPosition(
desiredAccuracy: LocationAccuracy.bestForNavigation,
timeLimit: Duration(seconds: 10),
);
LocationAccuracy.bestForNavigation — GPS + Barometer на iOS, GPS + sensor fusion на Android. При отказе GPS (подвал, здание) — fallback на network location, но явно помечаем точность в payload.
Координаты включаются в SOS-уведомление и отображаются на карте (MapLibre или Yandex MapKit) в приложении родителя с кнопкой «Построить маршрут».
Приложение родителя: обработка SOS-алерта
SOS-уведомление открывает экран с:
- Картой с меткой ребёнка
- Кнопками «Позвонить ребёнку» и «Я еду»
- Историей последних 10 геоточек (треком перемещения за последний час)
- Статусом — «SOS активен» с таймером
При тапе «Я еду» статус SOS помечается как «принято», и ребёнок получает уведомление «Мама выехала» — двусторонняя коммуникация через сервер.
Тестирование и требования к надёжности
Перед релизом: тест доставки SOS в Doze Mode, режиме «В самолёте» (только Wi-Fi), при слабом сигнале (3G). Нагрузочный тест: 100 SOS-сигналов одновременно — сервер должен обработать и доставить все в течение 10 секунд.
Apple при ревью проверяет корректность использования PushKit — нельзя использовать VoIP push для non-VoIP целей, иначе получите rejection.
Сроки разработки: 6–10 недель (приложение ребёнка + приложение родителя + серверная часть с дублированием каналов). Интеграция с существующим GPS-трекером — от 3 недель.







