我有一个应用程序,允许用户从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 } })