当我尝试呼叫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.
。但是,即使XCode中的应用程序为空,也存在此问题,并且不会停止执行。