本文介绍了如何在SWIFT 3中正确设置MPNowPlayingInfoCenter的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
(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
如果我从应用程序内向上滑动控制面板,计数器将同步。如果我带着Home键离开应用程序,并从主屏幕向上滑动控制面板,计数器将从零开始计数。
问题3
如果我在主屏幕上点击暂停/前进/后退按钮,它们工作正常。如果我在应用程序处于活动状态的情况下向上滑动控制面板,并按下按钮,则不会有任何反应。
我错过了什么?非常感谢您的帮助
tl;dr
问题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
推荐答案
答案更简单...
这是模拟器的问题...所有的虫子都只出现在模拟器上。一切在实际设备上都工作正常。
这篇关于如何在SWIFT 3中正确设置MPNowPlayingInfoCenter的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!