Подтвердить что ты не робот

Установка токенов в приложении Spotify iOS отключает обратный вызов для входа

Я пытаюсь настроить логин для своего приложения iOS с помощью Spotify SDK. У меня работает логин, но только без токенов. Как только я добавлю эти две строки кода:

SPTAuth.defaultInstance().tokenSwapURL = NSURL(string: kTokenSwapURL)
SPTAuth.defaultInstance().tokenRefreshURL = NSURL(string: kTokenRefreshServiceURL)

Вход не работает. Это мой код для входа.

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 for customization after application launch.

    // Override point for 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
        // This is the callback that'll be triggered when auth is 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 for what happens when session is got
        AuthHandler.sharedHandler.setLoginCallback({ success in
            if (success) {
                self.transitionToPlaylistScreen()
            }
        })

        // if session is 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 for login success
        NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("transitionToPlaylistScreen"), name: "loginSuccess", object: nil)

       // code to set up the 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)
        }
    }
}
4b9b3361

Ответ 1

Я предполагаю, что ваш сервер backend (swap/refresh) настроен неправильно, потому что неработающий сервер приведет к сбою входа в систему.

Я рекомендую этот репозиторий, который вы можете настроить на сервере с помощью простого сервера.

Ответ 2

Что я бы посоветовал вам попробовать несколько вещей:

  • Не могли бы вы разместить то, что находится в ваших URL-адресах Идентификатор и Схемы URL?
  • Я не знаю, важно ли это, но в моем случае Redirect URI и Схемы URL совпадают. Перенаправление URI может быть найден здесь в разделе Мои приложения.
  • Попробуйте написать второе приложение, которое открывает ваше приложение с помощью схемы URL. Если он не будет работать, то здесь проблема в схемах URL.

В качестве моментального снимка кода здесь:

let kCallbackURL = "myWhosampled://"
let url = NSURL(string: kCallbackURL)
UIApplication.sharedApplication().openURL(url!)

При создании файлов для токенов с использованием файла spotify_token_swap.rb вам нужно установить правильные значения для этого:

CLIENT_ID = "e6695c6d22214e0f832006889566df9c"
CLIENT_SECRET = "29eb02041ba646179a1189dccac112c7"
ENCRYPTION_SECRET = "cFJLyifeUJUBFWdHzVbykfDmPHtLKLGzViHW9aHGmyTLD8hGXC" 
CLIENT_CALLBACK_URL = "spotifyiossdkexample://"
AUTH_HEADER = "Basic " + Base64.strict_encode64(CLIENT_ID + ":" + CLIENT_SECRET)
SPOTIFY_ACCOUNTS_ENDPOINT = URI.parse("https://accounts.spotify.com")

set :port, 1234 # The port to bind to.
set :bind, '0.0.0.0' # IP address of the interface to listen on (all)