Разработка мобильного приложения для онлайн-школы
Онлайн-школа в мобильном виде — это не просто «веб-сайт в WebView». Как только добавляем офлайн-доступ к курсам, видео с адаптивным битрейтом и прогресс ученика, синхронизирующийся между устройствами, сложность проекта уходит на уровень полноценного edtech-продукта. Разбираем, что под капотом.
Видео — самая дорогая часть архитектуры
Учебное видео в онлайн-школе — не YouTube-embed. Нужна:
-
DRM-защита от скачивания: на iOS —
FairPlay Streaming, на Android —Widevine. Flutter пакетbetter_playerподдерживает оба через DRM-конфиги, но настройка лицензионного сервера (KSM для FairPlay или Widevine License Server) — отдельная инфраструктурная задача - Адаптивный стриминг: HLS для iOS, DASH для Android, транскодинг через AWS Elemental MediaConvert или Cloudflare Stream
-
Офлайн-просмотр: зашифрованная загрузка через
flutter_downloader+ AES-256 ключи, привязанные к deviceId — чтобы скачанное не работало на другом устройстве
Типичная ошибка: использовать video_player пакет без DRM. App Store не отклонит, но первый же скрипт для записи экрана снимет весь ваш контент.
Прогресс, геймификация и адаптивность
Прогресс урока — не просто «watched: true». Нужна гранулярность: процент просмотра (пользователь дошёл до 73%), последняя позиция для resume, результаты тестов. Хранить локально в Hive или drift (SQLite), синхронизировать с сервером при восстановлении сети — паттерн offline-first с connectivity_plus и очередью событий.
Геймификация (баллы, бейджи, стрики) хорошо работает в edtech и удерживает MAU. Реализация: серверный gamification-service с событийной шиной, клиент подписывается на achievement_unlocked события через WebSocket или Firebase Cloud Firestore snapshots(). Анимация получения награды — Lottie файл через lottie пакет Flutter.
Адаптивное обучение — более сложная история. Если школа хочет рекомендовать следующий урок на основе результатов тестов, нужна простая ML-модель или rule-based логика на бэкенде. На Flutter-клиенте — только отображение рекомендаций, вся логика серверная.
Архитектура приложения
Clean Architecture обязательна при такой сложности:
lib/
core/ # DI (GetIt), Network (Dio), Storage (Hive)
features/
courses/ # domain / data / presentation
player/ # domain / data / presentation
profile/ # domain / data / presentation
auth/ # JWT + refresh token rotation
Состояние — BLoC (flutter_bloc 8.x): предсказуемо, тестируемо, хорошо масштабируется при команде 3+ разработчиков. Навигация — go_router с deep linking (открыть конкретный урок по ссылке из email-рассылки).
Интеграции:
| Функция | Инструмент |
|---|---|
| Видео стриминг | Cloudflare Stream / AWS MediaConvert |
| DRM | FairPlay + Widevine |
| Push-уведомления | Firebase Cloud Messaging |
| Аналитика прогресса | Amplitude / Mixpanel |
| Платежи | Stripe / ЮKassa |
| Живые вебинары | Agora / Zoom SDK |
| Сертификаты | PDF generation на сервере, share через share_plus |
Публикация и ASO
Приложения онлайн-школ проходят ревью App Store по гайдлайну 3.1.1 — если продаёте курсы внутри приложения, Apple требует In-App Purchase. Обходной путь — «цифровые услуги, потребляемые вне приложения» — работает, но требует грамотного описания в метаданных. Google Play в этом плане мягче, но тоже имеет ограничения на внешние платёжные ссылки для определённых категорий.
Процесс и сроки
Этапы: аудит контентной модели → проектирование схемы данных → UI/UX Figma → разработка → QA → бета-тест с реальными учениками → публикация → поддержка.
MVP (курсы, видео без DRM, тесты, прогресс): 12–16 недель. Полноценная платформа с DRM, офлайн, геймификацией, вебинарами: 24–32 недели. Стоимость рассчитывается индивидуально после анализа контентной модели и требований к масштабированию.
Что часто недооценивают
Поддержка разных ролей (ученик / преподаватель / администратор / куратор) требует RBAC на уровне API — не «проверка роли в if-else на клиенте». Клиентский код всегда можно реверс-инжинировать. Каждый endpoint должен проверять разрешения независимо от того, что показывает UI.







