audio播放locking屏幕控件不在iPhone上显示

我正在使用iOS 10.2在我的实际iPhone 6s设备上进行testing。

我正在播放stream式audio,并且能够播放/暂停audio,跳过曲目等。我还启用了背景模式,并在后台播放audio,并正常播放列表。 我遇到的唯一问题是获取locking屏幕控件来显示。 没有任何显示…

在我的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) } } 

然后在我开始播放audio后在我的AudioPlayer类中调用…

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

当我locking我的iPhone,然后再次点击电源button进入locking屏幕,audio控制根本不显示。 就好像没有audio播放,我只是看到我的正常的背景照片。 此外,控制面板中不显示任何控制(在主屏幕上向上滑动,然后向左滑动至音乐控制的位置)。

问题是因为我没有使用AVAudioPlayer或AVPlayer? 但是,那么Spotify如何获得locking屏幕控件,以便使用自己的自定义audio播放器进行显示? 感谢您的任何build议/帮助

问题原来是这条线…

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

一旦我改变它

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

一切正常。 所以看来传入AVAudioSessionCategoryPlaybackOptions的任何参数都会导致locking屏幕控件无法显示。 我也尝试通过.mixWithOthers一个也导致锁屏控制不显示

是的,为了让锁屏工作,您需要使用iOS API来播放audio。 不知道Spotify如何做,但他们可能会并行使用第二个audio会话为此目的,并使用控件来控制两者。 你的后台处理程序(在我的情况下是单例)可以开始播放第二个音量为0的音量,当它进入后台,并在前台停止。 我没有testing它自己,但一个选项来尝试。