I’m working on an iOS app with Spotify integration and I’m facing difficulties with automatic session renewal. My current functions include handling login, checking session validity, saving, and loading the session, but when I attempt to renew the session, it consistently returns nil.
Authentication Method
func authenticateWithSpotify(presentingController controller: UIViewController, onSuccess: (token: String?) -> Void, onError: (err: NSError?) -> Void) {
successCallback = onSuccess
errorCallback = onError
SPTAuth.defaultInstance().clientID = MySpotifyClientID
SPTAuth.defaultInstance().redirectURL = NSURL(string: MyRedirectURI)
SPTAuth.defaultInstance().requestedScopes = [SPTAuthStreamingScope, SPTAuthPlaylistReadPrivateScope]
let authController = SPTAuthViewController.authenticationViewController()
authController.delegate = self
authController.clearCookies { () -> Void in
controller.presentViewController(authController, animated: true, completion: nil)
}
}
Session Validation
private func isSpotifyAuthenticated() -> Bool {
if SPTAuth.defaultInstance().session == nil {
self.restoreSpotifySession()
}
return SPTAuth.defaultInstance().session != nil
}
Session Persistence
private func storeSpotifySession() {
let data = NSKeyedArchiver.archivedDataWithRootObject(SPTAuth.defaultInstance().session)
NSUserDefaults.standardUserDefaults().setObject(data, forKey: Spotify_Auth_Key)
NSUserDefaults.standardUserDefaults().synchronize()
}
private func restoreSpotifySession() {
if let data = NSUserDefaults.standardUserDefaults().objectForKey(Spotify_Auth_Key) as? NSData {
let restoredSession = NSKeyedUnarchiver.unarchiveObjectWithData(data) as! SPTSession
SPTAuth.defaultInstance().session = restoredSession
}
}
Token Refresh Issue
func refreshSpotifyToken() {
guard isSpotifyAuthenticated() else {
return
}
SPTAuth.defaultInstance().renewSession(SPTAuth.defaultInstance().session) { (err: NSError!, newSession: SPTSession!) -> Void in
if newSession != nil {
SPTAuth.defaultInstance().session = newSession
} else {
print("Session refresh failed")
}
}
}
The refresh method keeps returning nil and I’m not sure how to handle the refresh token properly. What am I missing in my session renewal implementation?