如何在 Swift 3 中正确设置 MPNowPlayingInfoCenter
Posted
技术标签:
【中文标题】如何在 Swift 3 中正确设置 MPNowPlayingInfoCenter【英文标题】:How to properly set up the MPNowPlayingInfoCenter in Swift 3 【发布时间】:2017-04-09 20:02:28 【问题描述】:(tl;dr 在底部)
目前我正在通过以下方式设置属性:
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
上打印出globalPositionNumber
和globalDurationNumber
并且它们没有改变。正如预期的那样。
然后我实现了:
func audioStreaming(_ audioStreaming: SPTAudioStreamingController, didChangePlaybackStatus isPlaying: Bool)
if !isPlaying
setInfoCenterCredentials(globalPositionNumber, globalDurationNumber, 0)
现在有问题。点击暂停,会导致计时器被重置并从 0 开始,一旦恢复。
问题 #2
如果我从应用程序中向上滑动控制面板,计数器会同步。如果我使用主页按钮离开应用程序并从主屏幕向上滑动控制面板,计数器会从零开始计数。
问题 #3
如果我从主屏幕点击暂停/前进/后退按钮,它们运行良好。如果我在我的应用处于活动状态时向上滑动控制面板并按下按钮,则不会发生任何事情。
我错过了什么?非常感谢您的帮助
tl;dr
问题1:控制面板的计时器使用MPNowPlayingInfoPropertyPlaybackRate
1 重置或未设置则不停止。
问题 2:如果在赛道中离开 App,时间计数器会从零开始。
问题 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
【问题讨论】:
不应该。该框架运行良好 你在哪里定义时间计数器? 喜欢在func audioStreaming(_ audioStreaming: SPTAudioStreamingController, didChangePosition position: TimeInterval)
func audioStreaming(_ audioStreaming: SPTAudioStreamingController, didChangePosition position: TimeInterval)
发布的问题
isChangingProgress 如何管理?这似乎是控制计时器的变量。
加载新曲目时,此 var 将更改为 true,播放后将更改为 false。它也是一个全局变量。
【参考方案1】:
答案就更简单了……
这是模拟器的问题...所有的错误都只出现在模拟器上。 一切在实际设备上运行良好。
【讨论】:
【参考方案2】:我建议重新导入框架以确保没有集成问题。
由于 GitHub 上没有负面报道,而且代码看起来还不错,这可能只是一个集成问题。
希望这会有所帮助:)
【讨论】:
我已将赏金授予您。总比浪费好。感谢你的付出。但答案非常简单......希望我能在开始赏金之前尝试一下-.-以上是关于如何在 Swift 3 中正确设置 MPNowPlayingInfoCenter的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 中正确设置 imageView,如 imageContacts?
如何正确设置像 Swift 中的 imageContacts 一样的圆形 imageView?