2016-11-25 7 views
3

(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

Когда я ударяя кнопку паузы:

enter image description here

музыка останавливается, но время продолжает отсчет. Я распечатал globalPositionNumber и globalDurationNumber на их didSet, и они не меняются. Как и ожидалось.

Тогда я реализовал:

func audioStreaming(_ audioStreaming: SPTAudioStreamingController, didChangePlaybackStatus isPlaying: Bool) { 

    if !isPlaying { 
     setInfoCenterCredentials(globalPositionNumber, globalDurationNumber, 0) 
    } 
} 

проблема сейчас. Включение паузы приводит к сбросу таймера и начиная с 0 после возобновления.

Проблема № 2

enter image description hereenter image description here

Если я ударяя панель управления из приложения, счетчики синхронизируются. Если я покинул приложение с помощью кнопки «домой» и проверил панель управления с главного экрана, счетчик начнет отсчет с нуля.

Проблема № 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

+0

не должно быть. структура работает довольно хорошо –

+0

Где вы определяете счетчик времени? – GJZ

+0

как отправлено в вопрос, в 'func audioStreaming (_ audioStreaming: SPTAudioStreamingController, didChangePosition position: TimeInterval) {' –

ответ

4

Ответа было еще более простым ...

Это был вопрос о тренажере ... Все ошибки появились только тренажер. Все отлично работает на самом устройстве.

3

Я хотел бы предложить повторно импортировать базы для обеспечения нет никаких проблем с интеграцией.

Как нет отрицательных отчетов о GitHub, и код кажется прекрасным, это может быть просто проблема интеграции.

Надеется, что это помогает :)

+0

Я наградил вас щедростью. Лучше, чем потерять. Спасибо за ваши усилия. Но ответ настолько бесстрашный ... Желаю, чтобы я попробовал, прежде чем начать щедрость -.- –