Реалізація управління відтворенням через Lock Screen та Control Center

TRUETECH займається розробкою, підтримкою та обслуговуванням мобільних додатків iOS, Android, PWA. Маємо великий досвід та експертизу для публікації мобільних додатків до популярних маркетів Google Play, App Store, Amazon, AppGallery та інші.

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

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

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

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1735 послуг
Реалізація управління відтворенням через Lock Screen та Control Center
Середній
від 1 дня до 3 днів
Часті запитання

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

Етапи розробки

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

  • image_mobile-applications_feedme_467_0.webp
    Розробка мобільного додатка для компанії FEEDME
    792
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    671
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1097
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    969
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    914
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    495

Реалізація управління через Lock Screen та Control Center

Медіаконтроли на екрані блокування — не опціональна фіча, а стандарт ожидання для будь-якого медіаплеєра. Без них користувач вимушений розблокувати телефон, знайти застосунок та натиснути паузу замість того, щоб зробити це в одне касання прямо на Lock Screen.

iOS: MPNowPlayingInfoCenter та MPRemoteCommandCenter

Два незалежних об'єкти: перший відповідає за метаданні (що показувати), другий — за команди (що робити при натиску кнопок).

// Метаданні
var nowPlayingInfo: [String: Any] = [:]
nowPlayingInfo[MPMediaItemPropertyTitle] = track.title
nowPlayingInfo[MPMediaItemPropertyArtist] = track.artist
nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = player.currentTime().seconds
nowPlayingInfo[MPMediaItemPropertyPlaybackDuration] = track.duration
nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = player.rate // 0.0 пауза, 1.0 гра

// Обложка — асинхронно завантажуємо зображення
let artwork = MPMediaItemArtwork(boundsSize: CGSize(width: 300, height: 300)) { size in
    return self.trackArtworkImage ?? UIImage(named: "placeholder")!
}
nowPlayingInfo[MPMediaItemPropertyArtwork] = artwork

MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo

MPNowPlayingInfoPropertyElapsedPlaybackTime — поточна позиція в треку. Якщо не оновлювати при seek, прогрес-бар на Lock Screen буде розходитися з реальністю. Оновлюємо після кожного seek та кожні 5–10 секунд через таймер.

// Команди
let commandCenter = MPRemoteCommandCenter.shared()

commandCenter.playCommand.addTarget { [weak self] _ in
    self?.player.play()
    return .success
}
commandCenter.pauseCommand.addTarget { [weak self] _ in
    self?.player.pause()
    return .success
}
commandCenter.nextTrackCommand.addTarget { [weak self] _ in
    self?.playNext()
    return .success
}
commandCenter.changePlaybackPositionCommand.isEnabled = true
commandCenter.changePlaybackPositionCommand.addTarget { [weak self] event in
    guard let e = event as? MPChangePlaybackPositionCommandEvent else { return .commandFailed }
    self?.player.seek(to: CMTime(seconds: e.positionTime, preferredTimescale: 600))
    return .success
}

changePlaybackPositionCommand — повзунок на Lock Screen. Без нього користувач не може перемотати, не відкриваючи застосунку.

Команди потрібно вмикати/вимикати за контекстом: якщо в плейлисті один трек — commandCenter.nextTrackCommand.isEnabled = false.

Android: MediaSession та MediaNotification

val mediaSession = MediaSession.Builder(context, player)
    .setCallback(object : MediaSession.Callback {
        override fun onConnect(session: MediaSession, controller: MediaSession.ControllerInfo) =
            MediaSession.ConnectionResult.accept(
                SessionCommands.EMPTY,
                Player.Commands.Builder().addAllCommands().build()
            )
    })
    .build()

media3 автоматично створює сповіщення з медіаконтролами при використанні MediaSessionService. Кастомізація кнопок через DefaultMediaNotificationProvider:

class CustomNotificationProvider(context: Context) : DefaultMediaNotificationProvider(context) {
    override fun getMediaButtons(
        session: MediaSession, playerCommands: Player.Commands,
        customLayout: ImmutableList<CommandButton>, showPauseButton: Boolean
    ): ImmutableList<CommandButton> {
        // Додаємо кнопку "Улюблене" рядом із play/pause
        return super.getMediaButtons(session, playerCommands, customLayout, showPauseButton)
            .toMutableList().apply { add(favoriteButton) }.toImmutableList()
    }
}

Обложка у сповіщенні: MediaMetadata.Builder().setArtworkUri(uri).build() — система сама завантажує зображення за URI. Для уникнення ANR при завантаженні обложки через сеть — передзавантажуємо через Coil або Glide в CoroutineScope(Dispatchers.IO), передаємо готовий Bitmap через setArtworkData.

Flutter

audio_service (pub.dev) — стандартний пакет. Створюємо AudioHandler, реєструємо в AudioService.init(). Обробники команд: onPlay, onPause, onSkipToNext, onSeekTo. Метаданні — mediaItem в AudioHandler.

Орієнтири за часом

Медіаконтролі на iOS — 1 день (весь обсяг — налаштування двох об'єктів та оновлення метаданих). Android з кастомним сповіщенням — 1.5 дня. Flutter — 1–2 дні.