【问题标题】:Audio playback lock screen controls not displaying on iPhoneiPhone 上不显示音频播放锁定屏幕控件
【发布时间】:2017-03-07 19:42:09
【问题描述】:

我正在我的实际 iPhone 6s 设备上使用 iOS 10.2 对此进行测试。

我正在播放流式音频,并且能够播放/暂停音频、跳过曲目等。我还启用了后台模式,并且音频在后台播放并正确地继续播放列表。我遇到的唯一问题是显示锁定屏幕控件。什么都没有显示...

在我的 MainViewController 的 viewDidLoad() 中,当我的应用启动时,我称之为...

 func setupAudioSession(){

   UIApplication.shared.beginReceivingRemoteControlEvents()


   do {
       try    AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, with: AVAudioSessionCategoryOptions.mixWithOthers)

       self.becomeFirstResponder()

       do {
           try AVAudioSession.sharedInstance().setActive(true)
                   print("AVAudioSession is Active")
       } catch let error as NSError {
                   print(error.localizedDescription)

       }
   } catch let error as NSError {
               print(error.localizedDescription)
   }
}

然后在我开始播放音频后在我的 AudioPlayer 类中调用...

func setupLockScreen(){
       let commandCenter = MPRemoteCommandCenter.shared()
       commandCenter.nextTrackCommand.isEnabled = true
       commandCenter.nextTrackCommand.addTarget(self, action:#selector(skipTrack))
       MPNowPlayingInfoCenter.default().nowPlayingInfo = [MPMediaItemPropertyTitle: "TESTING"]
}

当我锁定我的 iPhone,然后再次点击电源按钮进入锁定屏幕时,根本不显示音频控件。好像没有播放音频,我只看到我的正常背景照片。控制面板中也没有显示任何控件(在主屏幕上向上滑动,然后向左滑动到音乐控件应位于的位置)。

问题是因为我没有使用 AVAudioPlayer 或 AVPlayer 吗?但是,例如,Spotify 如何使用自己的自定义音频播放器显示锁定屏幕控件?感谢您的任何建议/帮助

【问题讨论】:

    标签: ios swift audio media-player


    【解决方案1】:

    问题原来是这一行...

    try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, with: AVAudioSessionCategoryOptions.duckOthers)
    

    一旦我把它改成

    try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, with: [])
    

    一切正常。因此,似乎为 AVAudioSessionCategoryPlaybackOptions 传入任何参数都会导致锁定屏幕控件不显示。我还尝试传入.mixWithOthers ,这也导致锁屏控件不显示

    【讨论】:

    • 阅读 AVFoundation 文档了解详细信息developer.apple.com/documentation/avfoundation/…
    • 我又检查了一遍,但没有与此问题相关的内容。
    • 是的,我也没有看到任何东西。我认为由于.duckOthers 仍然允许播放其他音频,因此锁定屏幕控件不会显示,因为操作系统可能不知道要显示哪个音频控件,闪避音频或闪避音频......?因此,通过将其更改为仅允许播放您的音频的选项,对于显示控件的音频并因此显示它们没有歧义......这是我最好的猜测对不起我没有具体的答案
    【解决方案2】:

    在 Swift 4 中。此示例仅在锁定屏幕上显示播放器,适用于 iOS 11。要了解如何在设备上播放音频,您可以关注此线程 https://stackoverflow.com/a/47710809/1283517

    import MediaPlayer
    import AVFoundation
    

    声明播放器

    var player : AVPlayer?
    

    现在创建一个函数

    func setupLockScreen(){
            let commandCenter = MPRemoteCommandCenter.shared()
            commandCenter.nextTrackCommand.isEnabled = true
            commandCenter.togglePlayPauseCommand.addTarget(self, action: #selector(controlPause))
            MPNowPlayingInfoCenter.default().nowPlayingInfo = [MPMediaItemPropertyTitle: currentStation]
        }
    

    现在创建一个用于控制播放和暂停事件的函数。我创建了一个 BOOL "isPlaying" 来确定播放器的状态。

    @objc func controlPause() {
            if isPlaying == true {
                player?.pause()
                isPlaying = false
            } else {
                player?.play()
                isPlaying = true
            }
        }
    

    准备好了。现在播放器将显示在锁定屏幕上

    【讨论】:

    • 代码中在哪里调用setupLockScreen,能解释一下吗?
    【解决方案3】:

    是的,要使锁定屏幕正常工作,您需要使用 iOS API 来播放音频。不确定 Spotify 是如何做到的,但他们可能会为此并行使用第二个音频会话,并使用控件来控制两者。您的后台处理程序(在我的情况下为单例)可以在进入后台时以 0 音量开始播放第二个音频,并在前台时停止播放。我自己没有测试过,但可以尝试一下。

    【讨论】:

    • 好的,谢谢。我在 Spotify 的 iOS SDK 中的 Github 上提出了一个关于他们如何完成任务的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    • 2023-03-07
    • 1970-01-01
    相关资源
    最近更新 更多