Подтвердить что ты не робот

Как получить аудио-элементы управления на экране блокировки/центра управления с помощью AVAudioPlayer в Swift

Новое для разработки iOS, поэтому здесь. У меня есть приложение, которое воспроизводит аудио. Я использую AVAudioPlayer для загрузки отдельных файлов по имени в активах приложения. Я не хочу запрашивать пользовательскую библиотеку, только предоставленные файлы. Отлично работает, но я хочу, чтобы пользователь мог приостановить и настроить громкость на экране блокировки.

func initAudioPlayer(file:String, type:String){
    let path = NSBundle.mainBundle().pathForResource(file, ofType: type)!
    let url = NSURL(fileURLWithPath: path)
    let audioShouldPlay = audioPlaying()
    do{
        try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
        try AVAudioSession.sharedInstance().setActive(true)
        let audioPlayer:AVAudioPlayer = try AVAudioPlayer(contentsOfURL: url)
        audioPlayer.volume = slider.value
        audioPlayer.numberOfLoops = -1
        audioPlayer.prepareToPlay()
        if(audioShouldPlay){
            audioPlayer.play()
//                let mpic = MPNowPlayingInfoCenter.defaultCenter()
//                mpic.nowPlayingInfo = [MPMediaItemPropertyTitle:"title", MPMediaItemPropertyArtist:"artist"]
        }
    }
    catch{}
}

Мое использование AVAudioSession и MPNowPlayingInfoCenter было просто экспериментом по чтению других связанных сообщений.

Фоновый режим включен для звука в моем файле plist приложения

4b9b3361

Ответ 1

Вам нужно вызвать beginReceivingRemoteControlEvents(), иначе он не будет работать на самом устройстве.

Swift 3.1

UIApplication.shared.beginReceivingRemoteControlEvents()

Если вы хотите указать пользовательские действия для MPRemoteCommandCenter:

let commandCenter = MPRemoteCommandCenter.shared()
commandCenter.nextTrackCommand.isEnabled = true
commandCenter.nextTrackCommand.addTarget(self, action:#selector(nextTrackCommandSelector))

Ответ 2

func myplayer(file:String, type:String){
let path = NSBundle.mainBundle().pathForResource(file, ofType: type)!
let url = NSURL(fileURLWithPath: path)
let audioShouldPlay = audioPlaying()
do{
    try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
    try AVAudioSession.sharedInstance().setActive(true)
    let audioPlayer:AVAudioPlayer = try AVAudioPlayer(contentsOfURL: url)
    audioPlayer.volume = slider.value
    audioPlayer.numberOfLoops = -1
    audioPlayer.prepareToPlay()
    if(audioShouldPlay){
        audioPlayer.play()
//                let mpic = MPNowPlayingInfoCenter.defaultCenter()
//                mpic.nowPlayingInfo = [MPMediaItemPropertyTitle:"title", 
MPMediaItemPropertyArtist:"artist"]
        }
    }
    catch{}
}

Ответ 3

На экране блокировки уже есть элементы управления аудио (интерфейс "пульт дистанционного управления" ). Если вы хотите, чтобы они контролировали ваше приложение, вам нужно сделать свое приложение целевым пультом дистанционного управления, как описано в документация Apple.

Ответ 4

У меня есть эта проблема. Вам нужно только

audioSession.setCategory(.playback, mode: .default) or 
audioSession.setCategory(.playback, mode: .default, options: 
                                               .init(rawValue: 0)) 

Ответ 5

Для реализации этой функциональности используйте каркасы Media Player MPRemoteCommandCenter и MPNowPlayingInfoCenter с классами AVPlayer.

import MediaPlayer
import AVFoundation

// Configure AVPlayer
var player = AVPlayer()

Настройте удаленные обработчики команд

Определяет различные команды в форме объектов MPRemoteCommand, к которым вы можете прикрепить пользовательские обработчики событий для управления воспроизведением в вашем приложении.

    func setupRemoteTransportControls() {
    // Get the shared MPRemoteCommandCenter
    let commandCenter = MPRemoteCommandCenter.shared()

    // Add handler for Play Command
    commandCenter.playCommand.addTarget { [unowned self] event in
        if self.player.rate == 0.0 {
            self.player.play()
            return .success
        }
        return .commandFailed
    }

    // Add handler for Pause Command
    commandCenter.pauseCommand.addTarget { [unowned self] event in
        if self.player.rate == 1.0 {
            self.player.pause()
            return .success
        }
        return .commandFailed
    }
}

Обеспечить отображение метаданных

Предоставьте словарь метаданных, используя ключи, определенные MPMediaItem и MPNowPlayingInfoCenter, и установите этот словарь в экземпляре MPNowPlayingInfoCenter по умолчанию.

func setupNowPlaying() {
    // Define Now Playing Info
    var nowPlayingInfo = [String : Any]()
    nowPlayingInfo[MPMediaItemPropertyTitle] = "My Movie"

    if let image = UIImage(named: "lockscreen") {
        nowPlayingInfo[MPMediaItemPropertyArtwork] =
            MPMediaItemArtwork(boundsSize: image.size) { size in
                return image
        }
    }
    nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = playerItem.currentTime().seconds
    nowPlayingInfo[MPMediaItemPropertyPlaybackDuration] = playerItem.asset.duration.seconds
    nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = player.rate

    // Set the metadata
    MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo
}

Для получения дополнительной информации обратитесь к официальной документации Apple. Documentation