Разработка мобильного приложения для продажи онлайн-курсов
Приложение с онлайн-курсами — это не видеоплеер с покупкой. Ключевая метрика платформы с курсами — completion rate. Пользователь купил курс, посмотрел 2 лекции и не вернулся — для платформы это плохой сигнал, для пользователя — деньги на ветер. Техническая задача: интерфейс, который снижает friction при возвращении к курсу и не даёт пользователю потерять прогресс.
Прогресс, оффлайн и видеоплеер
Синхронизация прогресса. Пользователь смотрит урок на телефоне, продолжает на планшете. progress_position (timestamp в секундах) должен синхронизироваться. Схема: каждые 10–15 секунд просмотра — фоновый PATCH /progress/{lesson_id} с текущей позицией. При открытии урока — AVPlayer.seek(to: savedPosition). Optimistic update локально, sync в фоне через URLSession background task. Конфликт (два устройства параллельно) — берём максимальную позицию.
Оффлайн просмотр. Скачивание курса для просмотра без интернета — ключевая функция для мобилки. iOS: AVAssetDownloadTask + AVAssetDownloadURLSession — HLS скачивается как offline asset в AVOfflineAssetManager. Android: ExoPlayer DownloadManager с кешированием в файловую систему через SimpleCache. Прогресс скачивания — URLSessionDownloadDelegate / DownloadManager listener с обновлением UI через Progress / StateFlow.
Управление хранилищем: показываем, сколько места занимают скачанные курсы, даём возможность удалить. URLSession.shared.configuration.urlCache не подходит — нужен явный менеджмент через URLSessionDownloadTask с сохранением в Documents directory.
Видеоплеер. AVPlayerViewController на iOS — стандартный контейнер, но с ограниченной кастомизацией. Для полного контроля над UI — кастомный overlay поверх AVPlayerLayer: кнопки перемотки на ±10с, playback speed (0.75x / 1.25x / 1.5x / 2x через player.rate), subtitles через AVMediaCharacteristic.legible. На Android — ExoPlayer с кастомным PlayerView и DefaultTrackSelector для управления качеством (360p / 720p / 1080p по условиям сети через AdaptiveTrackSelection).
Структура курсов и навигация
Курс → Разделы → Уроки (видео, текст, квиз). Локальная БД: Core Data / Room. При открытии приложения — быстрая загрузка структуры из кеша, фоновое обновление с API. Пагинация не нужна для структуры курса — она невелика.
Квизы: QuizRepository c вопросами, варианты ответов, правильный ответ (только после попытки). Попытки хранятся локально + синхронизируются с сервером. Retake с cooldown — сервер решает, клиент отображает оставшееся время.
Сертификат по завершению — PDF генерация на сервере, скачивание через приложение, share через UIActivityViewController / Android ShareCompat.IntentBuilder. Добавление в Apple Wallet как Pass — нестандартно, но технически реализуемо для "элитных" платформ.
IAP и покупка курсов
Курс как non-consumable IAP (StoreKit 2 / Play Billing) или подписка на все курсы (auto-renewable). Non-consumable: Product.purchase() → Transaction.currentEntitlements → unlock конкретного курса на сервере по validated receipt. Restore purchases — обязательная кнопка в UI по требованиям App Store.
Альтернатива: web-billing (покупка через сайт), приложение только открывает купленный контент. Актуально для платформ с собственным сайтом — экономия на комиссии App Store.
Промокоды: SKPaymentQueue.presentCodeRedemptionSheet() на iOS 14+ для App Store offer codes. На Android — launchBillingFlow с PromoCode.
Геймификация и retention
Streak — ежедневные посещения. Счётчик streak хранится на сервере (не на клиенте — легко читерить), показывается на главном экране. При достижении milestone (7 дней, 30 дней) — push-уведомление + in-app celebration (Lottie анимация). При потере streak — recovery push «Не теряй прогресс».
Достижения (badges) за прохождение определённого числа уроков / курсов. Profile screen с прогрессом по всем курсам и badges. Небольшой social proof: «32 000 студентов прошли этот курс» — подгружается с API, не хардкод.
Стек
Flutter — оправдан для ed-tech: единая кодовая база, приемлемая производительность видеоплеера через video_player package (нативные AVPlayer/ExoPlayer под капотом), богатая экосистема. React Native — если команда уже на RN. Нативная разработка — если критична интеграция с AVOfflineAsset (iOS) или сложные download-сценарии.
Процесс работы
Проектирование структуры курсов и прогресса → разработка видеоплеера + оффлайн загрузки → IAP / billing интеграция → квизы + сертификаты → геймификация → QA (включая download + offline воспроизведение на реальных устройствах) → публикация.
Ориентиры по срокам
MVP (видеоуроки, прогресс, IAP покупка курсов): 4–7 недель. Полная платформа с оффлайном, квизами, сертификатами, streak-системой, поиском и поддержкой iOS + Android: 2–3 месяца.







