有没有办法使用 AVAudioEngine 和 AVAudioPlayerNode 显示锁屏控件?
Is there a way to show lock screen controls using AVAudioEngine and AVAudioPlayerNode?
我在我的应用程序中使用 AVAudioEngine 和 AVAudioPlayerNode 处理音频播放,我想实现远程控制。背景音频已配置并正常工作。
控制中心控件工作,但当我 play/pause 来自应用程序内部的音乐时,play/pause 按钮不会更新。 我正在真实设备上进行测试。
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()
调用的设置函数,这就是问题所在,我使用了 .play()
/.pause()
方法在我的 AVAudioPlayerNode 上操作音频,但是 AVAudioPlayerNode 不发出主音频 ,AVAudioEngine 的 outputNode 发出。
因此,无论何时您想要从应用程序内部或命令中心 play/pause 音频,如果您使用 AVAudioEngine 来处理应用程序中的音频,请不要忘记调用 .stop()
/.start()
AVAudioEngine 上的方法。即使没有将单个 属性 设置为 MPNowPlayingInfoCenter.default().nowPlayingInfo
.
,锁定屏幕控件应该会显示并且 play/pause 按钮应该会在命令 center/lock 屏幕中正确更新
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
}
}
我在我的应用程序中使用 AVAudioEngine 和 AVAudioPlayerNode 处理音频播放,我想实现远程控制。背景音频已配置并正常工作。
控制中心控件工作,但当我 play/pause 来自应用程序内部的音乐时,play/pause 按钮不会更新。 我正在真实设备上进行测试。
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()
调用的设置函数,这就是问题所在,我使用了 .play()
/.pause()
方法在我的 AVAudioPlayerNode 上操作音频,但是 AVAudioPlayerNode 不发出主音频 ,AVAudioEngine 的 outputNode 发出。
因此,无论何时您想要从应用程序内部或命令中心 play/pause 音频,如果您使用 AVAudioEngine 来处理应用程序中的音频,请不要忘记调用 .stop()
/.start()
AVAudioEngine 上的方法。即使没有将单个 属性 设置为 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
}
}