首页 文章

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

提问于
浏览
1

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

控制中心控制工作,但是当我从应用程序内部播放/暂停音乐时,播放/暂停按钮不会更新 . I am testing on a real device.

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 回答

  • 2

    所以这里是我的问题的解决方案,我正在启动我的AVAudioEngine以及从 viewDidLoad() 调用的设置函数,这就是问题,我在我的AVAudioPlayerNode上使用了 .play() / .pause() 方法来操纵音频,但AVAudioEngine的_输出节点 AVAudioPlayerNode does not emit master audio .

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

相关问题