我有一个应用程序,允许用户从spotify流式传输歌曲.因此,为了达到这个目的,每当用户想要从spotify流式传输歌曲时,我需要不时更新会话.我正在使用最新的spotify sdk(beta-9),我目前正在关注
https://www.youtube.com/watch?v=GeO00YdJ3cE的教程.在该教程中我们需要刷新令牌交换,但是当我从
https://developer.spotify.com/technologies/spotify-ios-sdk/tutorial/看时,没有必要刷新令牌交换.
并且我最终没有使用令牌交换,当我刷新我的会话然后用更新的会话播放歌曲时,我得到以下错误:
Error Domain=com.spotify.ios-sdk.playback Code=8 “Login to Spotify Failed because of invalid credentials.” UserInfo=0x7f840bf807b0 {NSLocalizedDescription=Login to Spotify Failed because of invalid credentials.}
我正在使用下面的代码来更新我的会话:
let userDefaults = NSUserDefaults.standardUserDefaults()
if let sessionObj : AnyObject = NSUserDefaults.standardUserDefaults().objectForKey("spotifySession") {
let sessionDataObj : NSData = sessionObj as! NSData
let session = NSKeyedUnarchiver.unarchiveObjectWithData(sessionDataObj) as! SPTSession
self.playUsingSession(session)
if !session.isValid() {
SPTAuth.defaultInstance().renewSession(session,callback: { (error : NSError!,newsession : SPTSession!) -> Void in
if error == nil {
let sessionData = NSKeyedArchiver.archivedDataWithRootObject(session)
userDefaults.setobject(sessionData,forKey: "spotifySession")
userDefaults.synchronize()
self.session = newsession
self.playUsingSession(newsession)
}else{
println("renew session having problerm >>>>> \(error)")
}
})
}else{
println("session is still valid")
self.playUsingSession(session)
}
}else{
spotifyLoginButton.hidden = false
}
以下代码流来识别歌曲:
func playUsingSession(sessionObj:SPTSession!){
if spotifyPlayer == nil {
spotifyPlayer = SPTAudioStreamingController(clientId: kSpotifyClientID)
}
spotifyPlayer?.loginWithSession(sessionObj,callback: { (error : NSError!) -> Void in
if error != nil {
println("enabling playback got error : \(error)")
return
}
var spotifyTrackUri : NSURL = NSURL(string: "spotify:track:3FREWTEY2uFxOorJZMmZPX")!
self.spotifyPlayer!.playURIs([spotifyTrackUri],fromIndex: 0,callback: { (error : NSError!) -> Void in
if error != nil {
println("\(error)")
}
})
})
}
我还需要为最新的sdk刷新令牌交换吗?或者我的代码中缺少什么?
解决方法
默认情况下,除非您使用授权代码流,否则用户需要每小时登录一次使用Spotify SDK的应用程序.要使用此流程,您需要设置服务器来处理令牌交换和刷新.
>通过一键部署到Heroku https://github.com/adamontherun/SpotifyTokenRefresh设置免费服务器
>使用上面创建的服务器的URL在配置SPTAuth.defaultInstance()时添加以下内容:
SPTAuth.defaultInstance().tokenSwapURL = URL(字符串:“https://YOURSERVERNAME.herokuapp.com/swap”)
SPTAuth.defaultInstance().tokenRefreshURL = URL(字符串:“https://YOURSERVERNAME.herokuapp.com/refresh”)
>在使用会话之前,请检查它是否有效:
如果SPTAuth.defaultInstance().session.isValid()
如果不是电话
SPTAuth.defaultInstance().renewSession(SPTAuth.defaultInstance().session,callback: { (error,session) in
if let session = session {
SPTAuth.defaultInstance().session = session
}
})