我在实际的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如何使用他们自己的自定义音频播放器来显示锁定屏幕控件?感谢您的任何建议/帮助
答案 0 :(得分:6)
问题原来是这条线......
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, with: AVAudioSessionCategoryOptions.duckOthers)
我将其更改为
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, with: [])
一切顺利。因此,似乎传入AVAudioSessionCategoryPlaybackOptions的任何参数都会导致锁屏控件无法显示。我也尝试传入.mixWithOthers
,这也导致锁定屏幕控件无法显示
答案 1 :(得分:0)
在Swift 4中,此示例仅用于在锁定屏幕上显示播放器,并且可在iOS 11上使用。要知道如何在设备上播放auidio,可以遵循以下线程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
}
}
准备好了。现在,播放器将显示在锁定屏幕上
答案 2 :(得分:-2)
是的,要使锁定屏幕正常工作,您需要使用iOS API播放音频。不确定Spotify是如何做到的,但他们可能正在为此目的并行使用第二个音频会话,并使用控件来控制它们。您的后台处理程序(在我的情况下为单例)可以在进入后台时以0音量开始播放第二个音频并在前景时停止播放。我自己没有经过测试,但可以选择尝试。