2016-03-12 17 views
6

は、私は私のアプリで楽しんでるログインを持って作られた自動ログインを試みる: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) 
    } 
} 

チェックセッションが存在する場合

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

セッションを保存する

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

ロードセッション

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

セッションを更新 -

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

renewSessionリターンnilを起動アプリで呼び出します。 私はrefreshTokenに関するいくつかの情報を見ましたが、私はそれを捕まえることができます。

私はスポットセッションを更新できますか?多分私は間違ったことをしました

答えて

4

60分ごとにアプリの再認証を必要とせずにセッションを更新するには、アプリが呼び出す場所のサーバー側スクリプトを実行する必要があります。その後、サーバー側スクリプトはSpotifyサーバーと通信して、新しいトークンを更新またはスワップアウトします。

ios-sdkダウンロードのデモプロジェクトディレクトリには、開発用にローカルで使用できるa sample scriptが含まれています。

これを済ませたら、かなり簡単です。どこか、あなたのスワップ/リフレッシュURLを設定するいくつかのコードがあります:私は理解したよう

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) 
    } 
} 
+0

:あなたはログインまたはセッションを更新したい場合、その後

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 

を、あなたはこのようなものを持つことができます私はサーバ上でスワップとリフレッシュ機能を実装し、これらのURLをSPTAuth()に追加する必要があります。 Spotifyはバックエンドを使用して自分のトークンを自動的に更新しますか? – Viktor

+0

私は自動的には言わないでしょう - 定期的に有効なトークンを持っていることを確認し、必要に応じて更新する必要があります。トークンの有効期限は60分です。 – brki

+0

私が間違っていると私を訂正してください: サーバーでスワップと更新機能を追加し、それらのURLをSTPAuth()に追加します。ログイン後、私は1時間の有効期限を持つaccessTokenを受け取ります。クライアントを閉じて2時間後にもう一度開いて "loginOrRenewSession"を呼び出すと、セッションが復元されますか?または、サーバー上のすべてのユーザーのアクセストークンを定期的に手動で更新する必要がありますか? – Viktor