Developing an EdTech/eLearning Mobile App
EdTech apps are one of the most technically diverse categories. Behind a simple interface of "lesson → video → quiz" lies: HLS streaming with adaptive bitrate, offline loading of encrypted videos, real-time interaction in live sessions, gamification mechanics, progress analytics, and often—white-label versions for B2B clients. Each of these points is a source of distinct complexity.
Video — The Main Technical Load
Most EdTech apps revolve around video content. Streaming via HLS (HTTP Live Streaming): server chunks video into 6–10 second segments, player selects quality based on network speed. On iOS—AVPlayer + AVPlayerViewController supports HLS natively. On Android—ExoPlayer (Media3): HlsMediaSource with DefaultTrackSelector for adaptive ABR.
DRM. Paid content must be protected from screen recording and copying. FairPlay (iOS) and Widevine L1 (Android)—standard for monetized EdTech. Widevine L3 (software protection) works on all Android devices but is less reliable. L1 requires TEE (Trusted Execution Environment)—available on Snapdragon 800+ and up.
Offline viewing. Loading lessons for offline viewing—key feature. On iOS: AVAssetDownloadTask saves HLS stream to HLSAssetDownloadDirectory, FairPlay license cached separately. On Android: DownloadManager in ExoPlayer with encryption via Android Keystore. Can't just download MP4—bypasses DRM. Right way: encrypted segments on disk, decryption during playback via license key.
Progress and Learning Analytics
Learning Record Store (LRS) and xAPI (Experience API)—standard for tracking learning: "user X completed lesson Y in Z minutes, answered 7 of 10 questions correctly." Tincan.io as popular implementation. For corporate EdTech needing SCORM-compatible LMS integration (Moodle, Cornerstone)—SCORM 1.2 or 2004.
On mobile, xAPI events sent to LRS via REST API: POST /statements with JSON payload. When offline—event queue in SQLite (Room on Android, CoreData on iOS), sync on network recovery via WorkManager/BGTaskScheduler.
// Android — sending xAPI statement via Room + WorkManager
@Entity
data class PendingStatement(
@PrimaryKey val id: String = UUID.randomUUID().toString(),
val statementJson: String,
val createdAt: Long = System.currentTimeMillis()
)
// On network loss — queue it
fun trackLessonCompleted(lessonId: String, durationSec: Int) {
val statement = buildXApiStatement(verb = "completed", object = lessonId, duration = durationSec)
db.pendingStatementDao().insert(PendingStatement(statementJson = statement.toJson()))
WorkManager.getInstance().enqueueUniqueWork("sync_xapi", KEEP, SyncStatementsWorker)
}
Interactive Content and Quizzes
Quizzes, code challenges, matching exercises—not just a list of questions. H5P—open format for interactive content, supported by Moodle and many LMS platforms. For mobile: WebView with H5P.js or native implementation via JSON schema.
Code evaluation in browser-based sandbox: WebView + Monaco Editor or CodeMirror, execution via Pyodide (Python in WASM) for simple tasks, or backend sandbox (Judge0, Piston) for compiled languages. On iOS WKWebView has JS execution limits: WKWebViewConfiguration.preferences.javaScriptEnabled = true, but WASM works from iOS 14+.
Gamification
Streak counter, badges, leaderboard, XP and levels—standard set. Technically: local counter + server sync. Streaks need careful timezone handling (traveling users, DST transitions). TimeZone.current on iOS and ZoneId.systemDefault() on Android—don't store dates in UTC without local midnight adjustment.
Push notifications for retention (streak reminder, "you've abandoned your course"): Firebase Cloud Messaging + local notifications via UNUserNotificationCenter (iOS) and NotificationManager (Android). Frequency—max 1–2 notifications/day, otherwise unsubscribe.
White-Label and Multi-Tenancy
For B2B EdTech where each corporate client wants their own app with logo: multi-tenant architecture with per-tenant config file (colors, fonts, logo, available content). iOS: Remote Config via Firebase or custom config endpoint, @Observable view-model with theme. Android: Dynamic theme via Material You dynamicColorScheme or custom Theme.kt.
Separate App Store listing per client—via App Store Connect API + fastlane deliver. Automation necessary at 10+ clients.
Timelines
MVP with video lessons, quizzes, and progress: 4–8 weeks. Platform with DRM, offline, live sessions, and LMS integration: 3–5 months. Cost calculated individually after analyzing requirements.







