如何在Spotify播放器中向前或向后10秒

时间:2019-03-27 11:58:22

标签: ios swift spotify duration

我试图在Spotify播放器中添加(向前移动)10秒的歌曲持续时间或减去(向后移动)10秒的歌曲持续时间,但是我真的很困惑如何添加或减去歌曲。

当我尝试使用此代码时,歌曲的持续时间不会改变

// 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)
    })
}

我们正在两个平台(Android和iOS)上使用相同的SDK制作音乐应用程序,Spotify SDK的seekToPosition方法在Android版本中正常运行,但是在iOS版本中不运行。委托方法会自我调用,但音乐会停止。

您能否告诉我们这种情况的发生原因,以及如何在iOS设备上运行它。

有人可以向我解释如何解决此问题,我已经尝试解决此问题,但没有结果。

任何帮助将不胜感激。

谢谢。

2 个答案:

答案 0 :(得分:1)

我不使用此API,因此我的答案将基于您的代码和Spotify的reference documentation

我认为您的流程有误:

  1. 正如Robert Dresler所评论的那样,您应该(大约)永远不要直接呼叫代表,代表会呼叫您。
  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可能会为您处理此事。

答案 1 :(得分:0)

您可以在此处查看示例:spotify/ios-sdk。他们在NowPlayingView example中使用'seekForward15Seconds',也许您可​​以使用?如果您仍然需要10s,我在下面添加了一个功能。位置以毫秒为单位。

  

“位置:要搜索的位置(以毫秒为单位)”   docs

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
        }
    }

编辑1:

要执行此操作,您需要遵循Prepare Your Environment

  

framwork

     

将SpotifyiOS.framework添加到您的Xcode项目中

希望有帮助!