MPNowPlayingInfoPropertyElapsedPlaybackTime not configured properly

I am trying to correctly set the elapsed playback time. When the player.seek function is called or the pause is paused, the current time of nowplayinginfocenter is not updated. I init nowplayinginfocenter using setNowPlaying (), and then calls setNowPlayingCurrentTime when the track is requested to update it in the information center.

However, when it is called, elapsed time gets reset to 0.

Any advice would be very helpful.

private func setNowPlaying(track: Track) { //set now playing info center if NSClassFromString("MPNowPlayingInfoCenter") != nil { //artwork var url = NSURL(string: track.artworkUrl!) var data = NSData(contentsOfURL: url!) var image = UIImage(data: data!) var albumArt = MPMediaItemArtwork(image: image) var songInfo: NSMutableDictionary = [ MPMediaItemPropertyTitle: track.title!, MPMediaItemPropertyArtwork: albumArt, MPMediaItemPropertyArtist: track.userName!, MPMediaItemPropertyPlaybackDuration: track.duration!, MPNowPlayingInfoPropertyPlaybackRate: 0 ] MPNowPlayingInfoCenter.defaultCenter().nowPlayingInfo = songInfo as NSObject as! [NSObject : AnyObject] } if (AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, error: nil)) { println("Receiving remote control events") UIApplication.sharedApplication().beginReceivingRemoteControlEvents() } else { println("Audio Session error.") } } private func setNowPlayingCurrentTime(track: Track, time: Float64) { var songInfo: NSDictionary = MPNowPlayingInfoCenter.defaultCenter().nowPlayingInfo songInfo.mutableCopy().setValue(Double(time), forKey: MPNowPlayingInfoPropertyElapsedPlaybackTime) println("test") println(songInfo.mutableCopy().valueForKey(MPNowPlayingInfoPropertyElapsedPlaybackTime)) MPNowPlayingInfoCenter.defaultCenter().nowPlayingInfo = songInfo.mutableCopy() as! NSObject as! [NSObject : AnyObject] } 
+6
source share
2 answers

I did it as follows (Swift 2) - the key correctly set the attributes during playback / pause.

  func play() { if self.player.currentItem != nil { player.play() //mpnowplaying info center MPNowPlayingInfoCenter.defaultCenter().nowPlayingInfo![MPNowPlayingInfoPropertyElapsedPlaybackTime] = CMTimeGetSeconds(player.currentTime()) MPNowPlayingInfoCenter.defaultCenter().nowPlayingInfo![MPNowPlayingInfoPropertyPlaybackRate] = 1 } else { loadTrackToPlayer() player.play() //mpnowplaying info center MPNowPlayingInfoCenter.defaultCenter().nowPlayingInfo![MPNowPlayingInfoPropertyElapsedPlaybackTime] = CMTimeGetSeconds(player.currentTime()) MPNowPlayingInfoCenter.defaultCenter().nowPlayingInfo![MPNowPlayingInfoPropertyPlaybackRate] = 1 } } func pause() { if self.player.currentItem != nil { player.pause() MPNowPlayingInfoCenter.defaultCenter().nowPlayingInfo![MPNowPlayingInfoPropertyPlaybackRate] = 0 MPNowPlayingInfoCenter.defaultCenter().nowPlayingInfo![MPNowPlayingInfoPropertyElapsedPlaybackTime] = CMTimeGetSeconds(player.currentTime()) } } 
+3
source

Swift 3

  if player.currentItem != nil { MPNowPlayingInfoCenter.default().nowPlayingInfo![MPNowPlayingInfoPropertyElapsedPlaybackTime] = CMTimeGetSeconds(player.currentTime()) MPNowPlayingInfoCenter.default().nowPlayingInfo![MPNowPlayingInfoPropertyPlaybackRate] = 1 } 

You will need to start this when paused, skip, change the speed, etc.

An example of a pause.

  if player.currentItem != nil { MPNowPlayingInfoCenter.default().nowPlayingInfo![MPNowPlayingInfoPropertyElapsedPlaybackTime] = CMTimeGetSeconds(player.currentTime()) MPNowPlayingInfoCenter.default().nowPlayingInfo![MPNowPlayingInfoPropertyPlaybackRate] = 0 } 

You do not need to update the movement of the scrubber, the lock screen will calculate the time for you, as long as you set the playback duration in nowPlayingInfo.

+2
source

All Articles