【发布时间】:2018-01-16 06:39:45
【问题描述】:
我正在制作一个包含音乐播放器的应用。我有一段时间没有工作了,但我最后一次工作是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))
}
}
出于某种原因,这是唯一会更新控制中心信息的东西。
【问题讨论】:
-
调用 setNowPlaying() 的线程是什么?它是在主线程上还是在辅助线程上?
-
@CharlesSrstka 主线程
标签: swift swift3 avqueueplayer mpnowplayinginfocenter