swift - Setting tokens in Spotify iOS app disables login callback -
i trying set login ios app using spotify's sdk. have login working, without tokens. once add these 2 lines of code:
sptauth.defaultinstance().tokenswapurl = nsurl(string: ktokenswapurl) sptauth.defaultinstance().tokenrefreshurl = nsurl(string: ktokenrefreshserviceurl)
the login not work. code login.
appdelegate.swift
let kclientid = "my-client-id" let kcallbackurl = "my-callback-url" let ktokenswapurl = "my-token-swap-url" let ktokenrefreshserviceurl = "my-token-refresh-url" func application(application: uiapplication, didfinishlaunchingwithoptions launchoptions: [nsobject: anyobject]?) -> bool { // override point customization after application launch. // override point customization after application launch. sptauth.defaultinstance().clientid = kclientid sptauth.defaultinstance().redirecturl = nsurl(string: kcallbackurl) sptauth.defaultinstance().requestedscopes = [sptauthstreamingscope, sptauthuserreadprivatescope, sptauthplaylistreadprivatescope] sptauth.defaultinstance().sessionuserdefaultskey = "spotifysession" window = uiwindow(frame: uiscreen.mainscreen().bounds) let loginviewcontroller = loginviewcontroller(nibname: "loginviewcontroller", bundle: nil) let navigationcontroller = uinavigationcontroller(rootviewcontroller: loginviewcontroller) window?.rootviewcontroller = navigationcontroller window?.makekeyandvisible() return true } func application(application: uiapplication, openurl url: nsurl, sourceapplication: string?, annotation: anyobject) -> bool { let authcallback : sptauthcallback = { error, session in // callback that'll triggered when auth completed (or fails). if (error != nil) { print(error); return; } let userdefaults = nsuserdefaults.standarduserdefaults() let sessiondata = nskeyedarchiver.archiveddatawithrootobject(session) userdefaults.setobject(sessiondata, forkey: sptauth.defaultinstance().sessionuserdefaultskey) userdefaults.synchronize() authhandler.sharedhandler.loginwithsession(session) }; if sptauth.defaultinstance().canhandleurl(url) { sptauth.defaultinstance().handleauthcallbackwithtriggeredauthurl(url, callback:authcallback) return true } return false; }
loginviewcontroller.swift
class loginviewcontroller: uiviewcontroller { let kclientid = "my-client-id" let kcallbackurl = "my-callback-url" let ktokenswapurl = "my-token-swap-url" let ktokenrefreshserviceurl = "my-token-refresh-url" var session: sptsession! var login: uibutton! var auth : sptauthviewcontroller? override func viewwillappear(animated: bool) { // set login callback happens when session got authhandler.sharedhandler.setlogincallback({ success in if (success) { self.transitiontoplaylistscreen() } }) // if session still valid, login let userdefaults = nsuserdefaults.standarduserdefaults() if let sessionobj:anyobject = userdefaults.objectforkey("spotifysession") { // session available let sessiondataobj = sessionobj as! nsdata let session = nskeyedunarchiver.unarchiveobjectwithdata(sessiondataobj) as! sptsession if !session.isvalid() { sptauth.defaultinstance().renewsession(session, callback: { (error:nserror!, renewdsession:sptsession!) -> void in if error == nil { let sessiondata = nskeyedarchiver.archiveddatawithrootobject(session) userdefaults.setobject(sessiondata, forkey: sptauth.defaultinstance().sessionuserdefaultskey) userdefaults.synchronize() self.session = renewdsession authhandler.sharedhandler.loginwithsession(self.session!) } else { print(error.localizeddescription) } }) } else { self.session = session authhandler.sharedhandler.loginwithsession(self.session!) } } } override func viewdidload() { // add observer login success nsnotificationcenter.defaultcenter().addobserver(self, selector: selector("transitiontoplaylistscreen"), name: "loginsuccess", object: nil) // code set login button } func transitiontoplaylistscreen() { if (self.auth != nil) { self.dismissviewcontrolleranimated(true, completion: nil) self.auth = nil } let playlistscreen = playlistviewcontroller() let navigation = uinavigationcontroller(rootviewcontroller: playlistscreen) dispatch_async(dispatch_get_main_queue(), { self.presentviewcontroller(navigation, animated: true, completion: nil) }) } func logintospotify() { // if session isn't valid, login within app dispatch_async(dispatch_get_main_queue(), { self.auth = sptauthviewcontroller.authenticationviewcontroller() self.auth?.delegate = authhandler.sharedhandler self.auth!.modalpresentationstyle = .overcurrentcontext self.auth!.modaltransitionstyle = .crossdissolve self.modalpresentationstyle = .currentcontext self.definespresentationcontext = true self.auth!.clearcookies({ dispatch_async(dispatch_get_main_queue(), { self.presentviewcontroller(self.auth!, animated: false, completion: nil) }) }) }) } }
authhandler.swift
class authhandler: nsobject, sptauthviewdelegate { static let sharedhandler = authhandler() var session: sptsession? var callback: (bool -> void)? func setlogincallback(callback: (bool -> void)) { self.callback = callback } func authenticationviewcontroller(authenticationviewcontroller: sptauthviewcontroller!, didfailtologin error: nserror!) { if let function = callback { function(false) } } func authenticationviewcontroller(authenticationviewcontroller: sptauthviewcontroller!, didloginwithsession session: sptsession!) { self.loginwithsession(session) } func authenticationviewcontrollerdidcancellogin(authenticationviewcontroller: sptauthviewcontroller!) { if let function = callback { function(false) } } func loginwithsession(session: sptsession) { self.session = session sptauth.defaultinstance().session = session if let function = callback { function(true) } } }
i guess backend (swap/refresh) server not set properly, because not working server cause log in fail.
i recommend this repository, can set simple server on heroku.
Comments
Post a Comment