raymanan11
raymanan11

Reputation: 63

didInititate method for Spotify IOS SDK is not calling even though called sessionManager.initiateSession()

I'm going through Spotify's authentication process and am requesting the scopes appRemoteControl for my app to control music and userReadCurrentlyPlaying for current song. I set up everything from the SPTConfiguration, SPTSessionManager, and SPTAppRemote, and their required delegate methods (SPTAppRemoteDelegate, SPTSessionManagerDelegate, SPTAppRemotePlayerStateDelegate) as well as initiating a session with the requested scopes whenever the user presses a button but I can't get the method

func sessionManager(manager: SPTSessionManager, didInitiate session: SPTSession) {
    appRemote.connectionParameters.accessToken = session.accessToken
    appRemote.connect()
    print(session.accessToken)
}

to trigger. The authentication process fully works as it goes into my spotify app and returns back to my application and plays a song from the configuration.playURI = "" , however, the method above never is called. I followed the spotify demo project but still does not work. Here is my full code

class LogInViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
}

let spotifyClientID = Constants.clientID
let spotifyRedirectURL = Constants.redirectURI

let tokenSwap = "https://***********.glitch.me/api/token"
let refresh = "https://***********.glitch.me/api/refresh_token"

lazy var configuration: SPTConfiguration = {
    let configuration = SPTConfiguration(clientID: spotifyClientID, redirectURL: URL(string: "Lyrically://callback")!)
    return configuration
}()

lazy var sessionManager: SPTSessionManager = {
    let manager = SPTSessionManager(configuration: configuration, delegate: self)
    if let tokenSwapURL = URL(string: tokenSwap), let tokenRefreshURL = URL(string: refresh) {
        self.configuration.tokenSwapURL = tokenSwapURL
        self.configuration.tokenRefreshURL = tokenRefreshURL
        self.configuration.playURI = ""
    }
    return manager
}()

lazy var appRemote: SPTAppRemote = {
    let appRemote = SPTAppRemote(configuration: configuration, logLevel: .debug)
    appRemote.delegate = self
    return appRemote
}()

@IBAction func logIn(_ sender: UIButton) {
    let requestedScopes: SPTScope = [.appRemoteControl, .userReadCurrentlyPlaying]
    sessionManager.initiateSession(with: requestedScopes, options: .default)
}

}

extension LogInViewController: SPTAppRemotePlayerStateDelegate {
func playerStateDidChange(_ playerState: SPTAppRemotePlayerState) {
    print("state changed")
}

}

extension LogInViewController: SPTAppRemoteDelegate {
func appRemoteDidEstablishConnection(_ appRemote: SPTAppRemote) {
    print("connected")
    appRemote.playerAPI?.delegate = self
    appRemote.playerAPI?.subscribe(toPlayerState: { (success, error) in
        if let error = error {
            print("Error subscribing to player state:" + error.localizedDescription)
        }
    })
}

func appRemote(_ appRemote: SPTAppRemote, didFailConnectionAttemptWithError error: Error?) {
    print("failed")
}

func appRemote(_ appRemote: SPTAppRemote, didDisconnectWithError error: Error?) {
    print("disconnected")
}

}

extension LogInViewController: SPTSessionManagerDelegate {

func sessionManager(manager: SPTSessionManager, didInitiate session: SPTSession) {
    appRemote.connectionParameters.accessToken = session.accessToken
    appRemote.connect()
    print(session.accessToken)
}

func sessionManager(manager: SPTSessionManager, didFailWith error: Error) {
    print("failed",error)
}

}

Upvotes: 2

Views: 649

Answers (1)

raymanan11
raymanan11

Reputation: 63

Figured it out. Had to get a hold of the sessionManager from the LogInViewController by making an instance of it

lazy var logInVC = LogInViewController()

then added this line of code into the openURLContexts method in scene delegate

func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
    print("Opened url")
    guard let url = URLContexts.first?.url else {
       return
    }
    logInVC.sessionManager.application(UIApplication.shared, open: url, options: [:])
}

Upvotes: 1

Related Questions