SPTSessionManager不会初始化或失败

问题描述 投票:0回答:1

[当我尝试呼叫sessionManager.initialize()时,既未呼叫func sessionManager(manager: SPTSessionManager, didFailWith error: Error)也未呼叫func sessionManager(manager: SPTSessionManager, didInitiate session: SPTSession)

我有一个运行在AWS上的nodeJS服务器,用于令牌访问和刷新,并且我还尝试过运行本地Ruby服务器来获取令牌。无论如何,调用initialize()都无济于事。它确实失败还是成功,并且没有任何输出到控制台。我试过运行XCode调试器,好像程序只是跳过initialize。这是我完整的ViewController.swift文件,其中删除了不相关/私有的部分:

import UIKit
import Firebase

class LobbyAdminViewController: UIViewController, SPTSessionManagerDelegate, SPTAppRemoteDelegate, SPTAppRemotePlayerStateDelegate  {
    fileprivate let SpotifyClientID = "client_id"
    fileprivate let SpotifyRedirectURI = URL(string: "redirect_url")!
    fileprivate var lastPlayerState: SPTAppRemotePlayerState?
    var refreshAPI = "token_server/refresh_token"
    var tokenAPI = "token_server/token"

    lazy var configuration: SPTConfiguration = {
           let configuration = SPTConfiguration(clientID: SpotifyClientID, redirectURL: SpotifyRedirectURI)
           configuration.playURI = ""
           configuration.tokenSwapURL = URL(string: tokenAPI)
           configuration.tokenRefreshURL = URL(string: refreshAPI)
           return configuration
       }()

       lazy var sessionManager: SPTSessionManager = {
           let manager = SPTSessionManager(configuration: configuration, delegate: self)
           return manager
       }()

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

    override func viewDidLoad() {
        super.viewDidLoad()
        let random = Int(arc4random_uniform(900000) + 100000)
        lobbyCode = String(random)
        lobbyCodeLabel.text = lobbyCode
        var ref: DatabaseReference!
        ref = Database.database().reference()
        ref.child(lobbyCode).child("null").setValue("null")
        let scope: SPTScope = [.appRemoteControl]
        if #available(iOS 11, *) {
            print("ios 11+")
            sessionManager.initiateSession(with: scope, options: .clientOnly)
        } else {
            print("ios 11-")
            sessionManager.initiateSession(with: scope, options: .clientOnly, presenting: self)
        }
    }

    func update(playerState: SPTAppRemotePlayerState) {
        print("Updating")
        lastPlayerState = playerState
        currentSongLabel.text = playerState.track.name
        currentArtistLabel.text = playerState.track.artist.name
        if playerState.isPaused {
            pausePlayButton.setBackgroundImage(UIImage(named: "play"), for: .normal)
        } else {
            pausePlayButton.setBackgroundImage(UIImage(named: "pause"), for: .normal)
        }
    }

    func fetchPlayerState() {
        print("Getting player state")
        appRemote.playerAPI?.getPlayerState({ [weak self] (playerState, error) in
            if let error = error {
                print("Error getting player state:" + error.localizedDescription)
            } else if let playerState = playerState as? SPTAppRemotePlayerState {
                self?.update(playerState: playerState)
            }
        })
    }

    @IBAction func onTap_pausePlayButton(_ sender: UIButton) {
        print("tapped")
        if let lastPlayerState = lastPlayerState, lastPlayerState.isPaused {
            appRemote.playerAPI?.resume(nil)
            print("Resuming")
        } else {
            appRemote.playerAPI?.pause(nil)
            print("Pausing")
        }
    }

    func sessionManager(manager: SPTSessionManager, didFailWith error: Error) {
        print("Bad init")
        print(error.localizedDescription)
    }

    func sessionManager(manager: SPTSessionManager, didRenew session: SPTSession) {
        print("Renewed")
    }

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

    // MARK: - SPTAppRemoteDelegate

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

    func appRemote(_ appRemote: SPTAppRemote, didDisconnectWithError error: Error?) {
        lastPlayerState = nil
        print("Error connecting to app remote")
    }

    func appRemote(_ appRemote: SPTAppRemote, didFailConnectionAttemptWithError error: Error?) {
        lastPlayerState = nil
        print("Another error connectiong to app remote")
    }

    // MARK: - SPTAppRemotePlayerAPIDelegate

    func playerStateDidChange(_ playerState: SPTAppRemotePlayerState) {
        print("Player state changed")
        update(playerState: playerState)
    }

    // MARK: - Private Helpers

    fileprivate func presentAlertController(title: String, message: String, buttonTitle: String) {
        let controller = UIAlertController(title: title, message: message, preferredStyle: .alert)
        let action = UIAlertAction(title: buttonTitle, style: .default, handler: nil)
        controller.addAction(action)
        present(controller, animated: true)
    }

}

唯一触发的print()语句是viewDidLoad()中的“ ios 11”我已经搜索了互联网上有同样问题的任何人,但空了。我唯一能想到的可能是导致此问题的原因是iOS 13的已知运行时问题。此错误:

Can't end BackgroundTask: no background task exists with identifier 8 (0x8), or it may have already been ended. Break in UIApplicationEndBackgroundTaskError() to debug.

每次将应用发送到后台(即,当应用重定向到Spotify进行身份验证时,都会触发)。但是,即使XCode中的应用程序为空,也存在此问题,并且不会停止执行。

ios swift xcode spotify
1个回答
0
投票

sessionManager初始化中,您需要包括manager.delegate = self。 SPTSessionManager需要知道代理的位置/位置-否则它将使用默认实现;)

应阅读

lazy var sessionManager: SPTSessionManager = {
           let manager = SPTSessionManager(configuration: configuration, delegate: self)
           manager.delegate = self
           return manager
       }()
© www.soinside.com 2019 - 2024. All rights reserved.