Розробка мобільного додатку для медитації
Додаток для медитації виглядає просто: екрани, аудіо, таймер. На справді — це точна робота з фоновим відтворенням, перериванням системи та тихою синхронізацією прогресу. Якщо аудіо переривається при вхідному звонку та не відновлюється — користувач видалить додаток через тиждень.
Аудіоплеєр: фонове відтворення та переривання
iOS. Налаштування AVAudioSession — перше, що потрібно робити правильно:
try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [.mixWithOthers, .allowAirPlay])
try AVAudioSession.sharedInstance().setActive(true)
Без .playback категорії аудіо зупинится при блокуванні екрану. UIBackgroundModes: audio в Info.plist обов'язковий.
Переривання (звонок, Siri, інший додаток): підписуємось на AVAudioSession.interruptionNotification. При .began — паузуємо та зберігаємо позицію. При .ended з shouldResume == true — відновлюємо. Без цієї логіки користувач після звонку бачит паузу, нажимає play вручну — UX сломан.
Remote Control (Lock Screen widget): налаштовуємо MPNowPlayingInfoCenter та MPRemoteCommandCenter. Інакше на заблокованому екрані немає кнопок управління.
Android. ExoPlayer (Media3) + MediaSessionService (Foreground Service). MediaSession забезпечує інтеграцію з system media controls. PlayerNotificationManager рисує сповіщення з play/pause/next. При знищенні Activity плеєр живе в сервісі — користувач продовжує медитацію зі згорнутим додатком.
Аудіофокус: AudioFocusRequest з AUDIOFOCUS_GAIN. При втраті фокусу (AUDIOFOCUS_LOSS_TRANSIENT) — ducking або пауза залежно від налаштування користувача.
Flutter. just_audio + audio_service — стандартна зв'язка. AudioService.init() запускає ізолят для відтворення в фоні.
Таймер сесії та управління структурою медитації
Медитація — це не просто аудіо від початку до кінця. Структура сесії:
- Вступна тишина (1-2 хв)
- Основна частина (5-30 хв)
- Колокіл початку / закінчення (short audio sample)
- Інтервальні нагадування кожні N хвилин
Реалізуємо через Combine/Flow/StreamController з таймером на основі DispatchSourceTimer (iOS) або CountDownTimer+Handler (Android). Важливо: таймер в фоні на iOS працює лише в контексті Background Task або в зв'язці з аудіо-сесією. Окремий Timer в фоні не гарантований.
Колокіл інтервалу — не сповіщення, а вставка аудіо-семпла в плеєр. AVAudioEngine з AVAudioMixerNode дозволяє мікшувати фонову музику + колокіл без переривання основного треку. На Android — SoundPool для коротких семплів поверх ExoPlayer через AudioFocus.
Прогрес та статистика
Сесії пишемо локально: дата, тривалість, тип медитації. SwiftData / Room / Hive. Статистика: серія днів (streak), загальний час за тиждень/місяць. Нагадування — UNUserNotificationCenter / AlarmManager з точним часом.
HealthKit (iOS) та Health Connect (Android): записуємо сесію як HKCategoryTypeIdentifier.mindfulSession / ExerciseSessionRecord(exerciseType = MEDITATION). Користувачі це цінують — дані попадають в Apple Health / Google Health.
Контент: офлайн та DRM
Для платного контенту — скачування треків з шифруванням AES-256 ключем, привязаним до аккаунту. На iOS: URLSessionDownloadTask + CryptoKit. На Android: DownloadManager + javax.crypto.Cipher. Без DRM користувач витягає треки з файлової системи.
Строки
MVP з плеєром, таймером, базовим каталогом та статистикою — 3-4 тижні. З підпискою, офлайн-контентом та HealthKit-інтеграцією — 6-8 тижнів.







