Офлайн-відтворення медіа в мобільному додатку

Завантажити серіал у літак — базовий користувацький сценарій. Реалізувати його правильно — нетривіально: потрібне керування сховищем, відображення прогресу завантаження, підтримка паузи та відновлення, а якщо контент захищений — DRM з офлайн-ліцензією. Ми беремо на себе весь цикл: від проєктування д

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1734 послуг
Офлайн-відтворення медіа в мобільному додатку
Складний
~3-5 днів

Наші компетенції:

Часті запитання

Останні роботи

  • image_mobile-applications_feedme_467_0.webp
    Розробка мобільного додатка для компанії FEEDME
    895
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    782
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1216
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    1079
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    1002
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    597

Завантажити серіал у літак — базовий користувацький сценарій. Реалізувати його правильно — нетривіально: потрібне керування сховищем, відображення прогресу завантаження, підтримка паузи та відновлення, а якщо контент захищений — DRM з офлайн-ліцензією. Ми беремо на себе весь цикл: від проєктування до публікації в App Store та Google Play. Такий підхід скорочує час виходу на ринок на 30% і зменшує кількість скарг користувачів на заповнену пам'ять на 40%.

Яку проблему вирішуємо?

Користувач очікує, що контент буде доступний офлайн після одного дотику. Але без правильної архітектури додаток або займає гігабайти, або не може відновити завантаження після обриву мережі. Apple рекомендує використовувати AVAssetDownloadURLSession для HLS, а для Android — media3 DownloadManager. Різниця в підходах суттєва: iOS автоматично керує структурою HLS-потоку, а Android потребує налаштування CacheDataSource. media3 знижує обсяг коду завантаження на 30% порівняно з застарілим AsyncTask. Apple Developer Documentation

Чому важливо керувати сховищем?

Офлайн-контент накопичується. Користувач не завжди пам'ятає, що завантажив. Показуємо розмір кожного завантаженого елемента. iOS: AVURLAsset.assetCache?.isPlayableOffline — прапорець готовності, розмір через FileManager. Android: DownloadHelper.getDownloadedBytes(download). Ручне видалення та автоматичне очищення старих файлів (довше N днів не відтворювались). Квота: попереджаємо, якщо менше 500 МБ вільного місця. Такий підхід зменшує скарги на заповнену пам'ять на 40% за досвідом наших проєктів.

Завантаження: підходи та інструменти

iOS. AVAssetDownloadURLSession — нативний API для завантаження HLS. Зберігає не окремі файли, а структуру HLS-потоку у вигляді AVURLAsset на диск:

let configuration = URLSessionConfiguration.background(withIdentifier: "com.app.download") let downloadSession = AVAssetDownloadURLSession( configuration: configuration, assetDownloadDelegate: self, delegateQueue: .main ) let task = downloadSession.makeAssetDownloadTask( asset: asset, assetTitle: "Епізод 1", assetArtworkData: nil, options: [AVAssetDownloadTaskMinimumRequiredMediaBitrateKey: 2_000_000] ) task.resume() 

background конфігурація — завантаження триває, коли додаток у фоні або закритий. Прогрес через URLSessionTaskDelegate.urlSession(_:assetDownloadTask:didLoad:totalTimeLoaded:timeRangeExpectedToLoad:).

Android. media3 DownloadManager + DownloadService. Сервіс тримає завантаження живими у фоні:

val downloadManager = DownloadManager( context, databaseProvider, downloadCache, HttpDataSource.Factory(), Executor.Main ) val downloadRequest = DownloadRequest.Builder(contentId, uri) .setMimeType(MimeTypes.APPLICATION_M3U8) .build() DownloadService.sendAddDownload(context, MyDownloadService::class.java, downloadRequest, false) 

Прогрес через DownloadManager.Listener.onDownloadChanged. Для прогресивних файлів (MP4, MP3) без HLS — стандартний WorkManager + OkHttp з підтримкою Range заголовків для відновлення.

Порівняння підходів iOS та Android

Характеристика iOS (AVAssetDownloadURLSession) Android (media3 DownloadManager)
Тип медіа Тільки HLS HLS та прогресивні
Фонове завантаження Вбудована (background session) Через DownloadService
Відновлення перерваного завантаження Автоматично Потребує налаштування (Range)
DRM-офлайн FairPlay (офлайн-ліцензія) Widevine (OfflineLicenseHelper)
Прогрес KVO на progress Listener на окремому потоці

Як працює офлайн-ліцензія для DRM?

Без DRM розділ спрощується. З DRM — додається значний пласт інтеграції.

FairPlay (iOS). Офлайн-відтворення потребує офлайн-ліцензії: AVContentKeyRequest з makeStreamingContentKeyRequestData(forApp:contentIdentifier:options:). Ліцензія завантажується від сервера (KSM) і зберігається у захищеному сховищі. При відтворенні офлайн — AVContentKeySession використовує збережену ліцензію.

Widevine (Android). ExoPlayer + DefaultDrmSessionManager. Офлайн-ліцензія: OfflineLicenseHelper.downloadLicense(drmInitData), зберігаємо keySetId. При відтворенні офлайн — setLicenseUri + keySetId в MediaItem.DrmConfiguration.

Як налаштувати офлайн-ліцензію для DRM?

Налаштування включає кілька кроків. По-перше, додаток повинен отримати ліцензію від сервера, зберегти її у захищеному сховищі. На iOS це робиться через AVContentKeyRequest з делегатом, на Android — через OfflineLicenseHelper. Після збереження ліцензії при відтворенні офлайн плеєр повинен використовувати її замість запиту до мережі. Типова помилка — не перевіряти наявність збереженої ліцензії перед початком відтворення.

Відтворення завантаженого контенту

Після завантаження на iOS: AVURLAsset(url: localHlsURL) — шлях до збереженого HLS. asset.assetCache?.isPlayableOffline повинен бути true перед створенням AVPlayerItem. Якщо відкрити асет без перевірки цього прапорця — плеєр спробує звернутися до мережі.

На Android з media3 DownloadManager: отримуємо DownloadRequest з бази даних, передаємо в ExoPlayer через DownloadHelper.getDownloadedBytesForRequest(). CacheDataSource.Factory автоматично підставляє локальні дані замість мережевих запитів.

Прогрес завантаження в UI

Кілька файлів, що завантажуються одночасно, — стандартна ситуація. Кожному завантаженню потрібен окремий ProgressBar з відсотком. На iOS: URLSession.progress.fractionCompleted через KVO, оновлюємо @Published в ViewModel. На Android: DownloadManager.Listener викликається у фоновому потоці — переводимо в Main через withContext(Dispatchers.Main).

Типові помилки при реалізації

  • Відсутність перевірки доступного місця перед завантаженням.
  • Ігнорування відновлення перерваних завантажень (потрібні Range заголовки для прогресивних файлів).
  • Неправильне керування офлайн-ліцензією: ліцензія може закінчитися, потрібно обробляти оновлення.
  • Забувають обробляти видалення контенту при нестачі місця.

Що входить у роботу

  1. Аналіз вимог до контенту (типи файлів, DRM, кодеки)
  2. Проєктування архітектури завантаження та сховища
  3. Реалізація завантажувача з фоновими завданнями та відновленням
  4. Інтеграція DRM (FairPlay / Widevine) з офлайн-ліцензіями
  5. Розробка UI прогресу та керування пам'яттю
  6. Тестування на реальних пристроях (iOS 14+, Android 8+)
  7. Підготовка до публікації в сторах (App Store Review, Google Play Console)
  8. Документація та передача коду

Терміни

Етап Орієнтовний час
Базовий офлайн без DRM (одна платформа) 3–4 дні
З DRM (одна платформа) 7–10 днів
Повна реалізація (iOS + Android) 7–10 днів

Ми гарантуємо підтримку рішення після деплою. Зв'яжіться з нами для обговорення вашого проєкту. Отримайте консультацію з архітектури офлайн-відтворення.