3

我正在我的应用程序中使用 AVAudioEngine 和 AVAudioPlayerNode 处理音频播放,并且我想实现远程控制。背景音频已配置并正常工作。

控制中心控件可以工作,但是当我从应用程序内部播放/暂停音乐时,播放/暂停按钮不会更新。我正在真实设备上进行测试。

控制中心截图

这是我的 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
    }
}

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

4

1 回答 1

7

所以这是我的问题的解决方案,我正在启动我的 AVAudioEngine 及其调用 from 的设置函数viewDidLoad(),这就是问题所在,我使用AVAudioPlayerNode 上的.play()/.pause()方法来操作音频,但是AVAudioPlayerNode 不发出主音频, outputNode 的AVAudioEngine 可以。

因此,每当您想从应用程序内部或命令中心播放/暂停音频时,如果您正在使用 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
    }
}
于 2018-04-25T17:07:24.537 回答