如何在Swift 3中正确设置MPNowPlayingInfoCenter

tl;博士在底部)

目前我正在通过以下方式设置属性:

let mpic = MPNowPlayingInfoCenter.default() func setInfoCenterCredentials(_ postion: NSNumber, _ duration: NSNumber, _ playbackState: Int) { let mySize = CGSize(width: 400, height: 400) let albumArt = MPMediaItemArtwork(boundsSize:mySize) { sz in return getCoverImage() } mpic.nowPlayingInfo = [MPMediaItemPropertyTitle: globalTrackName, MPMediaItemPropertyArtist: globalArtistName, MPMediaItemPropertyArtwork: albumArt, MPNowPlayingInfoPropertyElapsedPlaybackTime: postion, MPMediaItemPropertyPlaybackDuration: duration, MPNowPlayingInfoPropertyPlaybackRate: playbackState] } 

与Spotify iOS SDK一起使用:

 func audioStreaming(_ audioStreaming: SPTAudioStreamingController, didChangePosition position: TimeInterval) { if self.isChangingProgress { return } let position = Float(positionDouble / durationDouble) let duration = Float((sptAudioStreamCtr?.metadata.currentTrack!.duration)!) globalPositionNumber = NSNumber(value: position) globalDurationNumber = NSNumber(value: duration) setInfoCenterCredentials(globalPositionNumber, globalDurationNumber, 1) } 

到目前为止,这非常有效。

问题#1

当我按下暂停按钮时:

在此处输入图像描述

音乐停止了,但时间不断倒计时。 我已经在他们的didSet上打印出globalPositionNumberdidSet ,但它们没有被更改。 正如所料。

然后我实施了:

 func audioStreaming(_ audioStreaming: SPTAudioStreamingController, didChangePlaybackStatus isPlaying: Bool) { if !isPlaying { setInfoCenterCredentials(globalPositionNumber, globalDurationNumber, 0) } } 

现在问题。 点击暂停,导致定时器被重置并从0开始,一旦恢复。

问题#2

在此处输入图像描述 在此处输入图像描述

如果我从应用程序中向上滑动控制面板,则会同步计数器。 如果我使用主页按钮离开应用程序并从主屏幕向上滑动控制面板,计数器将从零开始计数。

问题#3

如果我从主屏幕点击暂停/前进/后退按钮,它们运行良好。 如果我在我的应用程序处于活动状态时向上滑动控制面板并且按下了按钮,则没有任何反应。

我错过了什么? 非常感谢帮助

TL;博士

问题1 :使用MPNowPlayingInfoPropertyPlaybackRate 1重置控制面板的时间,或者如果未设置则不停止。

问题2 :如果在轨道中离开应用程序,时间计数器将从零开始。

问题3 :在应用程序处于活动状态时按控制面板上的操作按钮无效。

编辑:

 override var canBecomeFirstResponder : Bool { return true } override func remoteControlReceived(with event: UIEvent?) { if let ctr = SPTAudioHandler.shared.audioCtrl { let rc = event!.subtype switch rc { case .remoteControlTogglePlayPause: ctr.setIsPlaying(!ctr.playbackState.isPlaying, callback: nil) case .remoteControlPlay: ctr.setIsPlaying(!ctr.playbackState.isPlaying, callback: nil) case .remoteControlPause: ctr.setIsPlaying(!ctr.playbackState.isPlaying, callback: nil) case .remoteControlNextTrack: globalBackForthInt = 1 getNextSpotifyTrack(SPTAudioHandler.shared.spotifyTracks, SPTAudioHandler.shared.playerView) globalTrackIndexPath = globalTrackIndexPath + 1 case .remoteControlPreviousTrack: getNextSpotifyTrack(SPTAudioHandler.shared.spotifyTracks, SPTAudioHandler.shared.playerView) globalBackForthInt = -1 getNextSpotifyTrack(SPTAudioHandler.shared.spotifyTracks, SPTAudioHandler.shared.playerView) globalTrackIndexPath = globalTrackIndexPath - 1 default: break } } } 

其他所有内容都在setInfoCenterCredentials设置

答案更简单……

这是模拟器的问题 ……所有的错误只出现在模拟器上。 在实际设备上一切正常。

我建议重新导入框架,以确保集成没有问题。

由于没有关于GitHub的负面报道并且代码似乎很好,它可能只是一个集成问题。

希望这可以帮助 :)