ios - Spotify session 管理

标签 ios swift spotify

我在我的应用程序中有一个 spotify 登录并尝试进行自动登录:

登录功能

func getSpotifyToken(fromController controller: UIViewController, success: (spotifyToken: String?) -> Void, failure: (error: NSError?) -> Void) {

    loginSuccessBlock = success
    loginFailureBlock = failure

    SPTAuth.defaultInstance().clientID        = SpotifyClientID
    SPTAuth.defaultInstance().redirectURL     = NSURL(string: SpotifyRedirectURI)
    SPTAuth.defaultInstance().requestedScopes = [SPTAuthStreamingScope, SPTAuthPlaylistReadPrivateScope]

    let spotifyLoginController = SPTAuthViewController.authenticationViewController()
    spotifyLoginController.delegate = self
    spotifyLoginController.clearCookies { () -> Void in
        controller.presentViewController(spotifyLoginController, animated: true, completion: nil)
    }
}

检查 session 是否存在

private func spotifyConnected() -> Bool {        
    if SPTAuth.defaultInstance().session == nil {
        self.loadSpotifySession()
    }        
    return SPTAuth.defaultInstance().session != nil
}

保存 session

private func saveSpotifySession() {
    let sessionData = NSKeyedArchiver.archivedDataWithRootObject(SPTAuth.defaultInstance().session)
    NSUserDefaults.standardUserDefaults().setObject(sessionData, forKey: Spotify_Session_Key)
    NSUserDefaults.standardUserDefaults().synchronize()
}

加载 session

private func loadSpotifySession() {        
    if let sessionData = NSUserDefaults.standardUserDefaults().objectForKey(Spotify_Session_Key) as? NSData {
        let session = NSKeyedUnarchiver.unarchiveObjectWithData(sessionData) as! SPTSession
        SPTAuth.defaultInstance().session = session
    }
}

更新 session - 在应用启动时调用

func renewSpotifySession() {        
    guard spotifyConnected() else {
        return
    }

    SPTAuth.defaultInstance().renewSession(SPTAuth.defaultInstance().session) { (error: NSError!, session: SPTSession!) -> Void in
        if session != nil {
            SPTAuth.defaultInstance().session = session                
        } else {
            print("Failed to refresh spotify session")
        }
    }        
}

更新 session 返回零。 我看到了一些关于 refreshToken 的信息,但我不知道在哪里可以获取它。

如何更新 spotify session ?也许我做错了什么?

最佳答案

为了在用户无需每 60 分钟重新授权您的应用的情况下续订 session ,您需要在应用调用的某个位置运行服务器端脚本。服务器端脚本然后与 Spotify 服务器对话以更新 token 或换出新 token 。

ios-sdk 下载中的演示项目目录包含 a sample script您可以在本地用于开发。

一旦准备就绪,就很容易了。在某个地方,您将拥有一些配置交换/刷新 URL 的代码:

let auth = SPTAuth.defaultInstance()
auth.clientID = Constant.SPOTIFY_CLIENT_ID;
auth.redirectURL = Constant.SPOTIFY_AUTH_CALLBACK_URL
auth.tokenSwapURL = Constant.SPOTIFY_TOKEN_SWAP_URL
auth.tokenRefreshURL = Constant.SPOTIFY_TOKEN_REFRESH_URL
auth.sessionUserDefaultsKey = Constant.SPOTIFY_SESSION_USER_DEFAULTS_KEY

然后,当你想登录或更新 session 时,你可以有这样的东西:

func loginOrRenewSession(handler: (loginTriggered: Bool, error: NSError?) -> Void) {
    guard auth.session != nil else {
        print("will trigger login")
        UIApplication.sharedApplication().openURL(auth.loginURL)
        handler(loginTriggered: true, error: nil)
        return
    }

    if auth.session.isValid() {
        print("already have a valid session, nothing to do")
        handler(loginTriggered: false, error: nil)
        return
    }

    print("will renew session")
    auth.renewSession(auth.session) { error, session in
        self.auth.session = session            
        handler(loginTriggered: false, error: error)
    }
}

关于ios - Spotify session 管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35958193/

相关文章:

ios - 绘图类绘制直线而不是曲线

ios - 核心数据 : How to structure a data model with a parent entity

ios - Spotify 获取所有用户的播放列表

swift - Spotify 续订 session fatal error : unexpectedly found nil while unwrapping an Optional value

ios - Spotify iOS SDK - 错误域 = com.spotify.ios-sdk 代码 = 500 "internal server error"

ios - 'NSInternalInconsistencyException'试图为同一索引路径使多个单元格出列,这是不允许的

ios - 来自 CMSampleBufferRef 源的音频信号处理

javascript - 使用 JSContext 在 Swift 中从 JavaScript 捕获打印语句

ios - 为什么我的 for 循环的索引在使用 grand dispatch 时会增加

ios - 在 Swift 中使用 UIButton 动画