Розроблення мобільного застосунку для продажи онлайн-курсів
Застосунок з онлайн-курсами — це не відеоплеєр з покупкою. Ключова метрика платформи з курсами — 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. При відкритті застосунку — швидка загрузка структури з кеша, фоновий update з 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 конкретного курсу на сервері за валідованим 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 пакет (нативні AVPlayer/ExoPlayer під капотом), багата екосистема. React Native — якщо команда вже на RN. Нативна розроблення — якщо критична інтеграція з AVOfflineAsset (iOS) або складні download-сценарії.
Процес роботи
Проектування структури курсів та прогресу → розроблення відеоплеєра + оффлайн загрузки → IAP / billing інтеграція → квізи + сертифікати → геймифікація → QA (включаючи download + offline відтворення на реальних пристроях) → публікація.
Ориентири по срокам
MVP (відеоуроки, прогрес, IAP покупка курсів): 4–7 тижнів. Повна платформа з оффлайном, квізами, сертифікатами, streak-системою, пошуком та підтримкою iOS + Android: 2–3 місяця.







