iPhone 上未显示音频播放锁屏控件

Audio playback lock screen controls not displaying on iPhone

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

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

在我的 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 class 中开始播放音频后,我调用 ...

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 API 来播放音频。不确定 Spotify 是如何做到的,但他们可能为此目的并行使用第二个音频会话,并使用控件来控制两者。您的后台处理程序(在我的例子中是单例)可以在第二个音频进入后台时以 0 音量开始播放,并在前台停止播放。我自己没有测试过,但可以尝试一下。

原来是这一行的问题...

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

一旦我将其更改为

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

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

在Swift 4.这个例子只是为了在锁定屏幕上显示播放器并且适用于iOS 11.要知道如何在设备上播放auidio,你可以关注这个线程

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
        }
    }

准备就绪。现在播放器会显示在锁屏界面