2016-03-12 20 views
6

Mam Spotify logowanie w mojej aplikacji i spróbować dokonał Chcesz zamówićSpotify zarządzania sesją

Logowanie funkcji

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

Sprawdź, czy sesja istnieje

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

Zapisz sesję

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

sesja ładowania

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

Renew sesji - zadzwoń w aplikacji rozpocząć

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 powrotną nil. Widziałem kilka informacji o refreshToken, ale nie wiem, gdzie mogę go złapać.

Jak mogę odnowić sesję spotify? może zrobiłem coś złego?

Odpowiedz

4

Aby odnowić sesję bez konieczności ponownej autoryzacji aplikacji co 60 minut, musisz uruchomić skrypt działający po stronie serwera, uruchomiony przez aplikację. Skrypt po stronie serwera następnie rozmawia z serwerami Spotify, aby odnowić lub zamienić token na nowy.

Katalog projektów demonstracyjnych w pakiecie ios-sdk zawiera a sample script, którego można używać lokalnie do programowania.

Po zainstalowaniu, jest to całkiem łatwe. Gdzieś będziesz mieć jakiś kod, który konfiguruje wizja/URL Refresh:

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 

Potem, gdy chcesz się zalogować lub odnowić sesję, można mieć coś takiego:

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

Jak rozumiem , Muszę zaimplementować funkcje wymiany i odświeżania na moim serwerze i dodać te adresy URL do SPTAuth(). Spotify automatycznie zaktualizuje moje tokeny za pomocą mojego backendu? – Viktor

+0

Nie powiedziałbym automatycznie - nadal musisz okresowo sprawdzać, czy masz ważny token i odśwież go, jeśli jest to konieczne. Tokeny wygasają po 60 minutach. – brki

+0

Popraw mnie, jeśli się mylę: Dodaję funkcje wymiany i odnowienia przez serwer i dodam adresy URL do STPAuth(). Po zalogowaniu otrzymam accessToken z wygaśnięciem 1 godziny. Czy po zamknięciu mojego klienta i ponownym otwarciu po 2h nastąpi przywrócenie sesji "loginOrRenewSession"? Czy muszę okresowo ręcznie odnawiać tokeny dostępu dla wszystkich użytkowników na serwerze? – Viktor