有没有办法使用AVAudioEngine和AVAudioPlayerNode显示锁定屏幕控件?

时间:2018-04-19 16:11:36

标签: ios swift avaudiosession avaudioengine mpremotecommandcenter

我在我的应用程序中使用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
    }
}

锁定屏幕控制 - 从未出现过。

1 个答案:

答案 0 :(得分:2)

所以这是我的问题的解决方案,我正在启动我的AVAudioEngine以及从viewDidLoad()调用的设置函数,这是问题,我使用.play() / .pause()方法在我的AVAudioPlayerNode上操纵音频,但 AVAudioPlayerNode不发出主音频,AVAudioEngine的outputNode确实如此。

因此,无论何时您想要从应用程序内部或从命令中心播放/暂停音频,如果您使用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
    }
}