When you setting the dictionary for nowPlayingInfo
you will want to set the MPNowPlayingInfoPropertyPlaybackRate
value appropriately. The MPNowPlayingInfoCenter
is expecting either a 1.0
(playing) or 0.0
(not playing) value as a Double
wrapped in a NSNumber
object. Below you will find the code for how I'm setting the nowPlayingInfo
in my project.
func setNowPlayingMediaWith(song: SUSong, currentTime: Double?) {
var playingInfo:[String: Any] = [:]
if let title = song.title {
playingInfo[MPMediaItemPropertyTitle] = title
}
if let songID = song.id {
playingInfo[MPMediaItemPropertyPersistentID] = songID
}
if let artist = song.artist, let artistName = artist.name {
playingInfo[MPMediaItemPropertyArtist] = artistName
}
if let album = song.album, let albumTitle = album.title {
var artwork:MPMediaItemArtwork? = nil
if let album = song.album, let artworkData = album.artwork {
artwork = MPMediaItemArtwork(boundsSize: Constants.Library.Albums.thumbSize, requestHandler: { (size) -> UIImage in
return UIImage(data: artworkData as Data)!
})
}
if artwork != nil {
playingInfo[MPMediaItemPropertyArtwork] = artwork!
}
playingInfo[MPMediaItemPropertyAlbumTitle] = albumTitle
}
var rate:Double = 0.0
if let time = currentTime {
playingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = time
playingInfo[MPMediaItemPropertyPlaybackDuration] = song.duration
rate = 1.0
}
playingInfo[MPNowPlayingInfoPropertyPlaybackRate] = NSNumber(value: rate)
playingInfo[MPNowPlayingInfoPropertyMediaType] = NSNumber(value: MPNowPlayingInfoMediaType.audio.rawValue)
MPNowPlayingInfoCenter.default().nowPlayingInfo = playingInfo
}
In this method I am passing the song
that my player is has currently loaded. Whenever the user chooses to play or pause I call setNowPlayingMediaWith(song:currentTime:)
to update the device's control console.
I keep track of the currentTime
(Double
) as a property of my player. If there is a currentTime
passed in that means we are meant to be playing, so set the MPNowPlayingInfoPropertyPlaybackRate
to 1.0
and set the MPNowPlayingInfoPropertyElapsedPlaybackTime
to currentTime
. This will set the current time to start automatically playing in the device's control console.
Likewise, if there is no currentTime
passed then we have stopped or paused. In this case we set the MPNowPlayingInfoPropertyPlaybackRate
to 0.0
and we do not include the MPNowPlayingInfoPropertyElapsedPlaybackTime
.
Download my app to see this in action.
EDIT (answer to comments)
"Is there a way to make this work without having to pause the videos in the FeedVC"
Without seeing your code it is difficult to give you a definite answer. It would make sense though to pause any ongoing media before starting your PlayerVC
's media.
"the elapsed time keeps counting"
The elapsed time will countdown the elapsed time based on an NSTimer
property on NowPlayingInfoCenter
. This timer will stop only when the timers value has reached the value you set in MPMediaItemPropertyPlaybackDuration
, or when you update the MPNowPlayingInfoPropertyElapsedPlaybackTime
.
My suggestion is to write a method that "clears out" the NowPlayingInfoCenter
. This method should set the will set all of key values to either 0.0 or nil respectively. Call this "clear out" method each time before you play your media in PlayerVC
. Then once you play from PlayerVC
, set the NowPlayingInfoCenter
key values like you would in the method I pasted in my answer to set the new values for the new playing media.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…