Реалізація 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 тижнів.







