简体   繁体   中英

I can't play music with Spotify iOS SDK with Swift 4.0

I have a struggle with Spotify SDK, I followed every step correctly, but I can't play music with my premium account on my project. There is no error or crash, my app directs me to the Spotify login page and after facebook login, It brings me back to my app again. Yesterday I'd get "logged in" print but today I can't. I'm trying to play a song after login and also manually as you see below. I'm wondering, am I lucky to find an answer?

override func viewDidLoad() {
    super.viewDidLoad()
    self.spotify()
    NotificationCenter.default.addObserver(self, selector: #selector(GeneralNewsViewController.updateAfterFirstLogin), name: NSNotification.Name(rawValue: "SpotifySession"), object: nil)
 }

func spotify() {
    // insert redirect your url and client ID below
    auth.redirectURL     = URL(string: "correctCallbackURl")
    auth.clientID        = "correctClientID"
    auth.requestedScopes = [SPTAuthStreamingScope, SPTAuthPlaylistReadPrivateScope, SPTAuthPlaylistModifyPublicScope, SPTAuthPlaylistModifyPrivateScope]
    loginUrl = auth.spotifyWebAuthenticationURL()
}

func initializaPlayer(authSession:SPTSession){
    if self.player == nil {
        self.player = SPTAudioStreamingController.sharedInstance()
        self.player!.playbackDelegate = self
        self.player!.delegate = self
        try! player?.start(withClientId: auth.clientID)
        self.player!.login(withAccessToken: authSession.accessToken)

    }
}


@objc func updateAfterFirstLogin () {

    loginButton.isHidden = true
    let userDefaults = UserDefaults.standard

    if let sessionObj:AnyObject = userDefaults.object(forKey: "SpotifySession") as AnyObject? {

        let sessionDataObj = sessionObj as! Data
        let firstTimeSession = NSKeyedUnarchiver.unarchiveObject(with: sessionDataObj) as! SPTSession

        self.session = firstTimeSession
        initializaPlayer(authSession: session)
        self.loginButton.isHidden = true
        // self.loadingLabel.isHidden = false

    }

}

func audioStreamingDidLogin(_ audioStreaming: SPTAudioStreamingController!) {
    // after a user authenticates a session, the SPTAudioStreamingController is then initialized and this method called
    print("logged in")
    self.player?.playSpotifyURI("spotify:track:4aDLPXlzHZm26GppvRwms8", startingWith: 0, startingWithPosition: 0, callback: { (error) in
        if (error != nil) {
            print("playing!")
        } else {
            print(error?.localizedDescription)
        }
    })
}

@objc func play() {
    player?.playSpotifyURI("spotify:track:4aDLPXlzHZm26GppvRwms8", startingWith: 0, startingWithPosition: 0, callback: { (err) in
        if err != nil {
            print(err?.localizedDescription)
        } else {

        }
    })
}

class AppDelegate: UIResponder, UIApplicationDelegate ,UNUserNotificationCenterDelegate{ 
    auth.redirectURL = URL(string: "correctCallbackURl")
    auth.sessionUserDefaultsKey = "current session"}

func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
    // 2- check if app can handle redirect URL
    if auth.canHandle(auth.redirectURL) {
        // 3 - handle callback in closure
        auth.handleAuthCallback(withTriggeredAuthURL: url, callback: { (error, session) in
            // 4- handle error
            if error != nil {
                print("error!")
            }
            // 5- Add session to User Defaults
            let userDefaults = UserDefaults.standard
            let sessionData = NSKeyedArchiver.archivedData(withRootObject: session!)
            userDefaults.set(sessionData, forKey: "SpotifySession")
            userDefaults.synchronize()
            // 6 - Tell notification center login is successful
            NotificationCenter.default.post(name: Notification.Name(rawValue: "loginSuccessfull"), object: nil)
        })
        return true
    }
    return false
}}

It looks like you're subscribed to the wrong notification, you're subscribing to "SpotifySession" but posting "loginSuccessfull"

this answer will help you making this kind of mistake in the future by having enums for events in a simple way.

good debugging is also key, you could've probably solved this problem with some breakpoints to see where you went wrong.

cheers

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM