Разработка мобильного приложения для медитации
Приложение для медитации выглядит просто: экраны, аудио, таймер. На деле — это точная работа с фоновым воспроизведением, прерываниями системы и тихой синхронизацией прогресса. Если аудио прерывается при входящем звонке и не восстанавливается — пользователь удалит приложение через неделю.
Аудиоплеер: фоновое воспроизведение и прерывания
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 недель.







