Розробка мобільного додатку для продажу онлайн-курсів
Замість відеоплеєра з покупкою створюємо платформу, де ключова метрика — 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 з питаннями, варіанти відповідей, правильна відповідь (тільки після спроби). Спроби зберігаються локально + синхронізуються з сервером. 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 (покупка через сайт), додаток тільки відкриває куплений контент. Актуально для платформ з власним сайтом — економія до 30% на комісії 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 «Не втрачай прогрес». Така система підвищує утримання на 50% у перший місяць.
Досягнення (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 день, зв'яжіться для консультації. Середня вартість MVP — від $5000, повна платформа — від $15000.
AVAssetDownloadTask | HTTP Live Streaming
Більше 8 років досвіду розробляємо мобільні додатки, реалізували 50+ edtech проєктів. Наші рішення працюють в App Store та Google Play з аудиторією в мільйони користувачів. Ми гарантуємо якість коду та проходження рев'ю.







