音频播放锁定屏幕控制不在iPhone上显示

时间:2017-03-07 19:42:09

标签: ios swift audio media-player

我在实际的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如何使用他们自己的自定义音频播放器来显示锁定屏幕控件?感谢您的任何建议/帮助

3 个答案:

答案 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音量开始播放第二个音频并在前景时停止播放。我自己没有经过测试,但可以选择尝试。