iOS 12音乐应用程序的锁屏控件

14

iOS 11中,在我锁定iPhone时,我的音乐应用程序将显示锁定屏幕控件。我能够看到当前播放的歌曲以及播放/暂停跳过向前和向后。然而在升级到Xcode 10/iOS 12后,我无法再看到锁定屏幕控件,只能看到日期和时间...

但是,如果我向上滑动并获得小部件屏幕(可以打开飞行模式等),我可以看到正在播放的信息。

这是我现在拥有的

在背景模式下

Modes

我已更新我的代码如下:

viewDidLoad中调用

do {
  try AVAudioSession.sharedInstance().setCategory(.soloAmbient, mode: .default, options: .allowAirPlay)
print("Playback OK")
  try AVAudioSession.sharedInstance().setActive(true)
  print("Session is Active")
} catch {
  print(error)
}


UIApplication.shared.beginReceivingRemoteControlEvents()
self.becomeFirstResponder()

在上一个工作版本中,我没有以下代码,但是我添加了它,因为我发现类似的帖子建议我这样做。

if let songInfo = self.mediaPlayer.nowPlayingItem {
  nowPlayingInfoCenter.nowPlayingInfo = [
    MPMediaItemPropertyTitle: songInfo.title ?? "",
    MPMediaItemPropertyArtist: songInfo.artist ?? "",
    MPMediaItemPropertyArtwork : songInfo.artwork?.image(at: CGSize(width: 400, height: 400)) ?? #imageLiteral(resourceName: "emptyArtworkImage")]
}

我在do try上设置了断点,但它没有打印任何一个打印函数,并跳过了try部分。

我是不是将我的代码转换错误了?


什么是错误信息? - ielyamani
没有错误信息。 - RubberDucky4444
您忘记实现 canBecomeFirstResponder - matt
@matt 我添加了 var canBecomeFirstResponder: Bool { return true },但是它并没有改变任何东西。 - RubberDucky4444
1个回答

17

不要忘记设置MPRemoteCommandCenter

import MediaPlayer

//Use an AVPlayer
var player: AVPlayer!
var playerItem: AVPlayerItem!

您可以在viewDidLoad中设置AVPlayer。

override func viewDidLoad() {
    super.viewDidLoad()

    let path = Bundle.main.path(forResource: "My Heart Will Go On", ofType:"mp3")!
    let url = URL(fileURLWithPath: path)
    playerItem = AVPlayerItem(url: url)
    player = AVPlayer(playerItem: playerItem)
    setupAudioSession()
}

这样设置音频会话:

func setupAudioSession() {
    do {
        try AVAudioSession.sharedInstance().setCategory(.soloAmbient, mode: .default, options: .allowAirPlay)
        try AVAudioSession.sharedInstance().setActive(true)
    } catch {
        print("Error setting the AVAudioSession:", error.localizedDescription)
    }
}
播放音频文件。
func play() {
    player.play()
    setupNowPlaying()
    setupRemoteCommandCenter()
}

设置MPNowPlayingInfoCenter(将其自定义为您的代码):

func setupNowPlaying() {
    // Define Now Playing Info
    var nowPlayingInfo = [String : Any]()
    nowPlayingInfo[MPMediaItemPropertyTitle] = "My Song"

    nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = playerItem.currentTime().seconds
    nowPlayingInfo[MPMediaItemPropertyPlaybackDuration] = playerItem.asset.duration.seconds
    nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = player.rate

    // Set the metadata
    MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo
    MPNowPlayingInfoCenter.default().playbackState = .playing
}

还有 MPRemoteCommandCenter

func setupRemoteCommandCenter() {
    let commandCenter = MPRemoteCommandCenter.shared();
    commandCenter.playCommand.isEnabled = true
    commandCenter.playCommand.addTarget {event in
        self.player.play()
        return .success
    }
    commandCenter.pauseCommand.isEnabled = true
    commandCenter.pauseCommand.addTarget {event in
        self.player.pause()
        return .success
    }
}

1
使用isEnabled解决了我的问题。谢谢。为什么这不在苹果自己的文档中呢?https://developer.apple.com/documentation/avfoundation/media_assets_playback_and_editing/creating_a_basic_video_player_ios_and_tvos/controlling_background_audio - Paul
如果您有多个AVPlayer或AVAudioPlayer,该如何实现呢? - pretz
@Paul 这里是 Apple 的官方文档,请查阅: https://developer.apple.com/documentation/avfoundation/media_playback_and_selection/creating_a_basic_video_player_ios_and_tvos/controlling_background_audio - Istiak Morsalin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接