Как сделать 10 секунд вперед или назад в Spotify игрока - PullRequest
10 голосов
/ 27 марта 2019

Я пытаюсь добавить (двигаться вперед) 10 секунд длительности песни или минус (двигаться назад) 10 секунд в Spotify player, но я действительно не понимаю, как добавить или минус.

Когда я пытаюсь использовать этот код, песня не изменяется длительностью

// forward button action 
@IBAction func moveFrdBtnAction(_ sender: Any) {
  SpotifyManager.shared.audioStreaming(SpotifyManager.shared.player, didSeekToPosition: TimeInterval(10))
}

// spotify delegate method seekToPosition
func audioStreaming(_ audioStreaming: SPTAudioStreamingController!, didSeekToPosition position: TimeInterval) {
    player?.seek(to: position, callback: { (error) in
        let songDuration = audioStreaming.metadata.currentTrack?.duration as Any as! Double
        self.delegate?.getSongTime(timeCount: Int(songDuration)+1)
    })
}

Мы создаем музыкальное приложение, использующее один и тот же SDK на обеих платформах (Android и iOS), метод seekToPosition Spotify SDK работает правильно в версии Android, однако в iOS он не работает. Метод делегата вызывает сам себя, но музыка останавливается.

Не могли бы вы сообщить нам, почему происходит такой сценарий, и что мы должны сделать, чтобы запустить его и на устройствах iOS.

Может кто-нибудь объяснить мне, как решить эту проблему, я пытался решить эту проблему, но пока нет результатов.

Любая помощь будет принята с благодарностью.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 07 апреля 2019

Я не использую этот API, поэтому мой ответ будет основан на вашем коде и справочной документации Spotify .

Я думаю, что в вашем потоке есть несколько ошибок:

  1. Как прокомментировал Роберт Дреслер , вы (приблизительно) никогда не должны вызывать делегата напрямую, делегат звонит вам.
  2. Я почти уверен, что ваше действие в настоящее время приводит к прыжку до ровно 10 секунд, а не на 10 секунд.

(Кстати, я бы предложил изменить имяваша функция moveFrdBtnAction по крайней мере добавить больше гласных)

В любом случае, вот мое лучшее предположение о том, что вы хотите:

// forward button action 
@IBAction func moveForwardButtonAction(_ sender: Any) {
   skipAudio(by: 10)
}

@IBAction func moveBackButtonAction(_ sender: Any) {
   skipAudio(by: -10)
}

func skipAudio(by interval: TimeInterval) {
   if let player = player {
      let position = player.playbackState.position // The documentation alludes to milliseconds but examples don't.
         player.seek(to: position + interval, callback: { (error) in
         // Handle the error (if any)
      })
   }
}

// spotify delegate method seekToPosition
func audioStreaming(_ audioStreaming: SPTAudioStreamingController!, didSeekToPosition position: TimeInterval) {
   // Update your UI
}

Обратите внимание, что я не обрабатывал поиск до началатрек, ни после конца, который может произойти с простым position + interval.API может обработать это для вас или нет.

0 голосов
/ 09 апреля 2019

Вы можете посмотреть примеры здесь: spotify / ios-sdk .В примере NowPlayingView они используют ' seekForward15Seconds ', может быть, вы могли бы использовать это?Если вам все еще нужны 10 секунд, я добавил функцию ниже.Позиция в миллисекундах.

"позиция: позиция для поиска в миллисекундах" документы

ViewController.swift

var appRemote: SPTAppRemote {
    get {
        return AppDelegate.sharedInstance.appRemote
    }
}

fileprivate func seekForward15Seconds() {
    appRemote.playerAPI?.seekForward15Seconds(defaultCallback)
}

fileprivate seekBackward15Seconds() {
    appRemote.playerAPI?.seekBackward15Seconds(defaultCallback)
}

// TODO: Or you could try this function
func seekForward(seconds: Int){
    appRemote.playerAPI?.getPlayerState({ (result, error) in
        // playback position in milliseconds
        let current_position = self.playerState?.playbackPosition
        let seconds_in_milliseconds = seconds * 1000

        self.appRemote.playerAPI?.seek(toPosition: current_position + seconds_in_milliseconds, callback: { (result, error) in
            guard error == nil else {
                print(error)
                return
            }
        })
    })
}

var defaultCallback: SPTAppRemoteCallback {
        get {
            return {[weak self] _, error in
                if let error = error {
                    self?.displayError(error as NSError)
                }
            }
        }
    }

AppDelegate.swift

lazy var appRemote: SPTAppRemote = {
        let configuration = SPTConfiguration(clientID: self.clientIdentifier, redirectURL: self.redirectUri)
        let appRemote = SPTAppRemote(configuration: configuration, logLevel: .debug)
        appRemote.connectionParameters.accessToken = self.accessToken
        appRemote.delegate = self
        return appRemote
    }()

    class var sharedInstance: AppDelegate {
        get {
            return UIApplication.shared.delegate as! AppDelegate
        }
    }

Edit1:

Чтобы это работало, вам необходимо следовать ПодготовитьОкружающая среда :

framwork

Добавьте SpotifyiOS.framework в ваш проект Xcode

Надеюсь, это поможет!

...