Разработка мобильного приложения для родительского контроля
Родительский контроль — это не просто «заблокировать TikTok». За этой формулировкой скрываются три технически несовместимых задачи: перехват трафика, ограничение системных функций и мониторинг активности — всё это на платформах, которые целенаправленно затрудняют подобные вещи. Apple и Google регулярно закрывают API, которыми жили предыдущие версии подобных приложений. Проектировать систему нужно с пониманием, что через год половина механизмов может измениться.
iOS: Screen Time API как единственный легальный путь
До iOS 16 разработчики использовали VPN-профили для перехвата DNS и MDM-конфигурации для ограничений. Всё это по-прежнему работает, но в App Store такие приложения не пройдут ревью — Apple 4.2 (minimum functionality) или прямой отказ за использование частных API.
Единственный легальный и стабильный путь на iOS сегодня — Family Controls из ManagedSettings и FamilyActivityPicker (iOS 16+, Swift). Родитель авторизует ребёнка через AuthorizationCenter.shared.requestAuthorization(for: .individual), и приложение получает доступ к:
-
ManagedSettingsStore— блокировка конкретных приложений, ограничение веб-сайтов через WebContentFilter, отключение App Store, ограничение экранного времени. -
DeviceActivityMonitor— фоновые расширения, которые получают событияintervalDidStart/EndиeventDidReachThresholdбез постоянно работающего основного приложения. -
ShieldConfiguration— кастомный экран-заглушка при попытке открыть заблокированное приложение.
Ограничение Family Controls: работает только для «дочернего» Apple ID в семейном доступе. Если ребёнок под отдельным взрослым Apple ID — API недоступен. Это организационная проблема, не техническая, но о ней нужно предупреждать заказчика на старте.
Типичная граблина при разработке: DeviceActivityMonitor — это App Extension, он запускается в отдельном процессе с ограниченными ресурсами. Попытка обратиться к CoreData в основном контейнере из расширения приводит к крэшу с NSPersistentStoreCoordinator: Multiple NSEntityDescriptions. Решение — App Group с общим SQLite-файлом через NSPersistentContainer с явным appGroupContainerIdentifier.
Android: сложнее, но гибче
Android даёт больше инструментов, но их сочетание требует точности. Рабочий стек:
UsageStatsManager — статистика использования приложений с точностью до пакета. Требует PACKAGE_USAGE_STATS — пользователь должен явно выдать разрешение в настройках (нельзя запросить через requestPermissions). Классический кейс: приложение запрашивает разрешение, пользователь нажимает «Назад», статистика не работает. Нужен onboarding с прямым Intent в Settings.ACTION_USAGE_ACCESS_SETTINGS.
DevicePolicyManager + Device Owner / Profile Owner. Device Owner даёт полный контроль: блокировка приложений, камеры, сетевых настроек. Установка Device Owner требует ADB-команды при первоначальной настройке (adb shell dpm set-device-owner), что непрактично для массового продукта. Profile Owner работает в рамках Work Profile — чуть менее мощный, но проще в развёртывании.
AccessibilityService — исторически популярный способ мониторинга активного приложения (TYPE_WINDOW_STATE_CHANGED). Google последовательно ужесточает правила Play Store: приложения с AccessibilityService без очевидной accessibility-причины выкидываются. Использовать только если нет альтернативы и есть убедительное обоснование для ревью.
VPN API (VpnService) — локальный VPN для DNS-фильтрации. Трафик не покидает устройство, всё фильтруется на loopback через DNS-резолвер. Работает без root. Применяем в связке с заблокированными базами доменов (StevenBlack, Pi-hole lists). Проблема: некоторые приложения используют DoH (DNS-over-HTTPS) и обходят DNS-фильтр. Решение — deep packet inspection по SNI через TLS-прокси, но это уже сложнее и требует установки корневого сертификата.
Мониторинг геолокации
CLLocationManager на iOS и FusedLocationProviderClient на Android — стандарт для фоновой геолокации. Но у фоновой геолокации есть нюансы: iOS с iOS 13 показывает пользователю уведомление «Приложение X использует вашу геолокацию» — ребёнок его видит. На Android с версии 10 нужно ACCESS_BACKGROUND_LOCATION + объяснение в Google Play Console.
Для экономии батареи используем геозоны (CLCircularRegion / GeofencingClient) вместо непрерывного трекинга. Событие входа/выхода из зоны генерирует push-уведомление родителю. Непрерывный трекинг — только по явному запросу.
Синхронизация и родительский дашборд
Данные с детского устройства → зашифрованный канал → бэкенд → родительское приложение. Шифрование E2E не обязательно для этой задачи — TLS с mutual auth достаточно. Но хранить статистику активности приложений, историю браузера и геолокацию — это чувствительные данные, которые требуют соответствия GDPR/COPPA (если пользователи младше 13 лет).
COPPA в контексте мобильного приложения означает: согласие родителя перед сбором любых данных о ребёнке, минимизацию собираемых данных, возможность удаления по запросу. Apple и Google требуют явного указания в App Store Connect / Play Console о сборе данных несовершеннолетних.
Этапы проекта
Выбор платформы и API-стратегии → проектирование архитектуры (клиент-ребёнок, клиент-родитель, бэкенд) → разработка ограничительных механизмов → мониторинг активности → геолокация → дашборд родителя → тестирование на устройствах разных версий OS → ревью App Store / Google Play → поддержка.
Сроки: MVP с базовыми ограничениями приложений и мониторингом — от 8 недель на одну платформу. Полноценный продукт с двумя платформами, геолокацией, DNS-фильтрацией и дашбордом — 4–6 месяцев. Стоимость рассчитывается индивидуально.







