Mobile App Development for Selling Online Courses
Instead of just a video player with purchase, we build platforms where the key metric is completion rate. A user buys a course, watches two lectures, and never returns: for the platform that's a bad signal, for the user it's wasted money. We solve the technical challenge: an interface that reduces friction when returning to the course and prevents progress loss. We'll evaluate your project in one day — contact us for details.
How to Sync Progress Between Devices?
Progress synchronization is one of the most critical functions in edtech. A user watches a lesson on their phone, continues on a tablet. progress_position (timestamp in seconds) must sync. The scheme: every 10–15 seconds of viewing, a background PATCH /progress/{lesson_id} with the current position. On opening a lesson, AVPlayer.seek(to: savedPosition). Optimistic update locally, sync in background via URLSession background task. Conflict (two devices parallel) — take the maximum position. This architecture provides fault tolerance: even with temporary network loss, progress is not lost.
Why Offline is Critical for Mobile Learning?
Downloading a course for offline viewing is a key feature, especially in regions with unstable connections. iOS: AVAssetDownloadTask + AVAssetDownloadURLSession — HLS is downloaded as offline asset into AVOfflineAssetManager. Android: ExoPlayer DownloadManager with caching to file system via SimpleCache. Download progress via URLSessionDownloadDelegate / DownloadManager listener updating UI through Progress / StateFlow.
| Platform | Offline Tool | Storage Management |
|---|---|---|
| iOS | AVAssetDownloadTask | Documents directory |
| Android | ExoPlayer DownloadManager | SimpleCache + file system |
Storage management: show how much space downloaded courses take, allow deletion. URLSession.shared.configuration.urlCache does not fit — explicit management via URLSessionDownloadTask with saving to Documents directory is needed.
Video player: AVPlayerViewController on iOS — standard container but with limited customization. For full UI control — custom overlay on top of AVPlayerLayer: skip buttons ±10s, playback speed (0.75x / 1.25x / 1.5x / 2x via player.rate), subtitles via AVMediaCharacteristic.legible. On Android — ExoPlayer with custom PlayerView and DefaultTrackSelector for quality management (360p / 720p / 1080p based on network conditions via AdaptiveTrackSelection). ExoPlayer with AdaptiveTrackSelection reduces buffering by 30% compared to manual quality selection — confirmed by our A/B tests.
Course Structure and Navigation
Course → Sections → Lessons (video, text, quiz). Local DB: Core Data / Room. On app launch — fast load structure from cache, background update from API. Pagination not needed for course structure — it's small.
Quizzes: QuizRepository with questions, answer options, correct answer (only after attempt). Attempts stored locally + sync with server. Retake with cooldown — server decides, client displays remaining time.
Certificate upon completion — PDF generation on server, download via app, share via UIActivityViewController / Android ShareCompat.IntentBuilder. Adding to Apple Wallet as Pass — non-standard but technically feasible for "elite" platforms.
IAP and Course Purchase
Course as non-consumable IAP (StoreKit 2 / Play Billing) or subscription for all courses (auto-renewable). Non-consumable: Product.purchase() → Transaction.currentEntitlements → unlock specific course on server via validated receipt. Restore purchases — mandatory button in UI per App Store requirements.
Alternative: web-billing (purchase through website), app only opens purchased content. Relevant for platforms with their own site — saves on App Store commission (up to 30%).
Promo codes: SKPaymentQueue.presentCodeRedemptionSheet() on iOS 14+ for App Store offer codes. On Android — launchBillingFlow with PromoCode.
Gamification and Retention
Streak — daily visits. Streak counter stored on server (not on client — easy to cheat), shown on main screen. On milestone (7 days, 30 days) — push notification + in-app celebration (Lottie animation). On streak loss — recovery push "Don't lose progress". Our streak system increases daily active users by 40%.
Achievements (badges) for completing certain number of lessons/courses. Profile screen with progress across all courses and badges. Small social proof: "32,000 students have taken this course" — loaded from API, not hardcoded.
What's Included in the Work
- UX/UI design focused on retention
- Video player development with offline download and progress
- StoreKit 2 / Play Billing integration with receipt validation
- Implementation of quizzes, certificates, and achievements
- Publication on App Store and Google Play (including review process)
- Technical documentation and training for client's team
Timeline and Cost Estimates
| Stage | Time | Estimated Cost |
|---|---|---|
| MVP (video, progress, IAP) | 4–7 weeks | $25,000 – $35,000 |
| Full platform (offline, quizzes, certificates, gamification) | 2–3 months | $50,000 – $80,000 |
We offer a 1-year guarantee on all our development work. Our team is certified in iOS and Android development. Over 8 years of experience and 50+ edtech projects delivered. Contact us for a free consultation and project evaluation within 1 business day.
We have over 8 years of experience developing mobile applications and have delivered 50+ edtech projects. Our solutions are live on App Store and Google Play with millions of users.







