(Tl; др на дне)Как правильно настроить MPNowPlayingInfoCenter в Swift 3
В настоящее время я настройки свойств по:
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
Когда я ударяя кнопку паузы:
музыка останавливается, но время продолжает отсчет. Я распечатал globalPositionNumber
и globalDurationNumber
на их didSet
, и они не меняются. Как и ожидалось.
Тогда я реализовал:
func audioStreaming(_ audioStreaming: SPTAudioStreamingController, didChangePlaybackStatus isPlaying: Bool) {
if !isPlaying {
setInfoCenterCredentials(globalPositionNumber, globalDurationNumber, 0)
}
}
проблема сейчас. Включение паузы приводит к сбросу таймера и начиная с 0 после возобновления.
Проблема № 2
Если я ударяя панель управления из приложения, счетчики синхронизируются. Если я покинул приложение с помощью кнопки «домой» и проверил панель управления с главного экрана, счетчик начнет отсчет с нуля.
Проблема № 3
Если я Hittin пауза/перемотка вперед/назад кнопки на главном экране, они работают хорошо. Если я подниму панель управления с активным приложением и нажимаю кнопки, ничего не происходит.
Что мне не хватает? Помощь очень ценится
ТЛ; Др
Задача 1: Время противоионы панели управления с помощью MPNowPlayingInfoPropertyPlaybackRate
сбрасывается 1 или не останавливаясь, если не установлен.
Задача 2: Счетчик времени начинается с нуля, если оставлено приложение во время дорожки.
Задача 3: Нажатие кнопок действий на панели управления с активным приложением не влияет.
Edit:
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
не должно быть. структура работает довольно хорошо –
Где вы определяете счетчик времени? – GJZ
как отправлено в вопрос, в 'func audioStreaming (_ audioStreaming: SPTAudioStreamingController, didChangePosition position: TimeInterval) {' –