15

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

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 моего приложения

+0

Что вопрос/проблема? – matt

+0

Вопрос в том, как я получаю аудиоконтроль на экране блокировки. Я видел, что MPNowPlayingInfoCenter nowPlayingInfo - это то, как передать метаданные песни в экран блокировки/центр управления, но мне не хватает того, как связать его с помощью AVAudioPlayer. – nbpeth

+0

На экране блокировки уже есть элементы управления аудио. – matt

ответ

24

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

Swift 3,1

UIApplication.shared.beginReceivingRemoteControlEvents() 

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

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

окончательного ответа, 'UIApplication.sharedApplication(). BeginReceivingRemoteControlEvents()' и 'AVAudioSession.sharedInstance(). SetCategory (AVAudioSessionCategoryPlayback)' – nbpeth

+0

http://stackoverflow.com/a/30280699/2303865 –

+1

где точно должны ли эти строки быть размещены? Я не могу получить элементы управления блокировкой экрана для отображения для моего приложения, хотя воспроизведение звука работает нормально – MikeG

3

Есть уже управления аудиосистемой на экране блокировки (далее «пульт дистанционного управления» интерфейс). Если вы хотите, чтобы они контролировали звук вашего приложения, вам необходимо сделать свое приложение целью дистанционного управления, как описано в Apple's documentation.

+0

Я объясняю один способ сделать это в моей книге; пример кода здесь: https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/bk2ch14p643ducking/ch27p912ducking/ViewController.swift Или вы можете использовать MPRemoteCommandCenter. – matt

+0

ха-ха, хорошо. Я на самом деле смотрел на это раньше. Я изучу его конец. Любые мысли о том, почему фоновый режим может работать в симуляторе, но не на реальном iphone – nbpeth

+0

Симулятор ненадежен в отношении фоновых режимов - не используйте его для каких-либо экспериментов в этом отношении. Это известная, признанная ошибка. – matt

3
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{} 
}