Разработка мобильного приложения для продажи онлайн-курсов
Вместо видеоплеера с покупкой создаём платформу, где ключевая метрика — completion rate. Пользователь купил курс, посмотрел две лекции и не вернулся: для платформы это плохой сигнал, для пользователя — деньги на ветер. Мы решаем техническую задачу: интерфейс, который снижает friction при возвращении к курсу и не даёт пользователю потерять прогресс. Оценим ваш проект за 1 день, свяжитесь — расскажем детали.
Как синхронизировать прогресс между устройствами?
Синхронизация прогресса — одна из самых критичных функций в edtech. Пользователь смотрит урок на телефоне, продолжает на планшете. 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.
| Платформа | Инструмент для оффлайна | Управление хранилищем |
|---|---|---|
| iOS | AVAssetDownloadTask | Documents directory |
| Android | ExoPlayer DownloadManager | SimpleCache + файловая система |
Управление хранилищем: показываем, сколько места занимают скачанные курсы, даём возможность удалить. 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). ExoPlayer с AdaptiveTrackSelection снижает буферизацию на 30% по сравнению с ручным выбором качества — это подтверждено нашими A/B тестами.
Структура курсов и навигация
Курс → Разделы → Уроки (видео, текст, квиз). Локальная БД: 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, не хардкод.
Что входит в работу
- Проектирование UX/UI с фокусом на retention
- Разработка видеоплеера с оффлайн-загрузкой и прогрессом
- Интеграция StoreKit 2 / Play Billing с валидацией receipt
- Реализация квизов, сертификатов и достижений
- Публикация в App Store и Google Play (включая прохождение ревью)
- Техническая документация и обучение команды заказчика
Ориентиры по срокам
| Этап | Время |
|---|---|
| MVP (видео, прогресс, IAP) | 4–7 недель |
| Полная платформа (оффлайн, квизы, сертификаты, геймификация) | 2–3 месяца |
Стоимость рассчитывается индивидуально под ваш проект. Оценим за 1 день, свяжитесь для консультации.
Apple Developer Documentation: AVAssetDownloadTask | Wikipedia: HTTP Live Streaming
Более 8 лет разрабатываем мобильные приложения, реализовали 50+ edtech проектов. Наши решения работают в App Store и Google Play с аудиторией в миллионы пользователей.







