我正在使用我的应用程序中的AVAudioEngine和AVAudioPlayerNode处理音频播放,我想实现远程控制。背景音频已配置并且可以正常工作。
控制中心控制工作,但是当我从应用程序内部播放/暂停音乐时,播放/暂停按钮不会更新。 我正在真实设备上进行测试。
Control center screenshot
这是我的AVAudioSession设置代码:
func setupAudioSession() {
UIApplication.shared.beginReceivingRemoteControlEvents()
do {
try AVAudioSession.sharedInstance().setActive(true)
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
} catch let sessionError {
print("Failed to activate session:", sessionError)
}
}
MPRemoteCommandCenter设置:
func setupRemoteControl() {
let commandCenter = MPRemoteCommandCenter.shared()
commandCenter.playCommand.isEnabled = true
commandCenter.playCommand.addTarget { (_) -> MPRemoteCommandHandlerStatus in
self.audioPlayerNode.play()
return .success
}
commandCenter.pauseCommand.isEnabled = true
commandCenter.pauseCommand.addTarget { (_) -> MPRemoteCommandHandlerStatus in
self.audioPlayerNode.pause()
return .success
}
}
锁屏控件-从未出现。
最佳答案
所以这是我问题的解决方案,就是我启动了AVAudioEngine及其从viewDidLoad()
调用的安装函数,这就是问题所在,并且我在AVAudioPlayerNode上使用了.play()
/ .pause()
方法来操作音频,但是 AVAudioPlayerNode不会发出主音频audio ,AVAudioEngine的outputNode可以。
因此,每当您要从应用程序内部或命令中心播放/暂停音频时,如果您正在使用AVAudioEngine处理应用程序中的音频,请不要忘记在AVAudioEngine上调用.stop()
/ .start()
方法。即使没有将单个属性设置为MPNowPlayingInfoCenter.default().nowPlayingInfo
,锁定屏幕控件也应该显示,并且播放/暂停按钮应该在命令中心/锁定屏幕中正确更新。
MPRemoteCommandCenter设置:
func setupRemoteControl() {
let commandCenter = MPRemoteCommandCenter.shared()
commandCenter.playCommand.isEnabled = true
commandCenter.playCommand.addTarget { (_) -> MPRemoteCommandHandlerStatus in
try? self.audioEngine.start()
return .success
}
commandCenter.pauseCommand.isEnabled = true
commandCenter.pauseCommand.addTarget { (_) -> MPRemoteCommandHandlerStatus in
self.audioEngine.stop()
return .success
}
}