我正在制作一个带有音乐播放器的应用程序。我已经有一段时间没有工作了,但上次我工作时nowPlayingInfo
是可以使用的。现在,当我将其更新为Swift 3时,除了进度条之外,一切都正常。
我在这里看到了一些类似的问题,谈论了竞争条件以及被某些东西覆盖,但我似乎无法找出原因。如果有帮助的话,我正在使用AVQueuePlayer
。
跳过和上一个按钮可以正常工作,专辑封面、标题和艺术家也可以完美地更新,但已经流逝的时间却没有更新。当我进行调试时,来自MPNowPlayingInfoCenter.default().nowPlayingInfo
的MPNowPlayingInfoPropertyElapsedPlaybackTime
显示了正确的数字,但实际的控制中心屏幕没有更新。通常情况下,进度条停留在0:01,不会动。然而,如果我在我的应用程序中使用滑块进行搜索,然后返回到控制中心,它会显示我搜索到的时间,但仍然停留在那里。
这是我的setNowPlaying
代码:
func setNowPlaying(_ dura: Float, timePlayed: Float) {
let s = songs[playbackInstance.currentSongIndex]
let albumArt = MPMediaItemArtwork.init(boundsSize: CGSize(width: 480, height: 360), requestHandler: { (size) -> UIImage in
return self.songImageView.image ?? #imageLiteral(resourceName: "WhiteMusic")
})
let songInfo: [String: Any]? = [
MPMediaItemPropertyTitle: s.name,
MPMediaItemPropertyArtist: s.artist,
MPMediaItemPropertyArtwork: albumArt,
MPMediaItemPropertyPlaybackDuration: dura,
MPNowPlayingInfoPropertyElapsedPlaybackTime: CMTimeGetSeconds(player.currentTime())
]
MPNowPlayingInfoCenter.default().nowPlayingInfo = songInfo
}
我曾经将MPNowPlayingInfoPropertyElapsedPlaybackTime
设置为传递给该方法的timePlayed
变量,但由于它不起作用,我尝试了其他问题中建议的player.currentTime()
,这可能比我使用的更好。
以下是寻求帮助时的代码:
@IBAction func sliderChanged(_ sender: UISlider) {
if timer.isValid {
currentTimeLabel.text = secondsToText(sender.value)
player.seek(to: CMTimeMakeWithSeconds(Float64(sender.value), player.currentItem!.currentTime().timescale))
}
}
由于某种原因,这是唯一能更新控制中心信息的方法。