我想做什么:
我正在将Spotify SDK实施到我的iOS项目中。我能够成功收到Spotify API的访问 token ,因为我能够使用所述API进行搜索艺术家,搜索歌曲和查看播放列表等操作。

我正在努力做的一件事就是使用SDK播放音乐。我有一个按钮,单击后就希望发生以下流程:

我通过执行以下功能并使用以下 session 管理器来请求Spotify访问:

let SpotifyClientID = "###"
let SpotifyRedirectURL = URL(string: "bandmate://")!

lazy var configuration = SPTConfiguration(
    clientID: SpotifyClientID,
    redirectURL: SpotifyRedirectURL
)

lazy var sessionManager: SPTSessionManager = {
    if let tokenSwapURL = URL(string: "https://bandmateallcaps.herokuapp.com/api/token"),
        let tokenRefreshURL = URL(string: "https://bandmateallcaps.herokuapp.com/api/refresh_token") {
        configuration.tokenSwapURL = tokenSwapURL
        configuration.tokenRefreshURL = tokenRefreshURL
        configuration.playURI = ""
    }
    let manager = SPTSessionManager(configuration: configuration, delegate: self)
    return manager
}()

func requestSpotifyAccess() {
    let requestedScopes: SPTScope = [.appRemoteControl, .userReadPrivate]
    self.sessionManager.initiateSession(with: requestedScopes, options: .default)
}

在启动SPTSession之后,我想连接我的遥控器:
lazy var appRemote: SPTAppRemote = {
    let appRemote = SPTAppRemote(configuration: configuration, logLevel: .debug)
    appRemote.delegate = self
    return appRemote
}()

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

应用连接后,我要播放全局声明的Spotify曲目的ID:
var pendingSpotifyId: String!

func appRemoteDidEstablishConnection(_ appRemote: SPTAppRemote) {
    print("connected")

    self.appRemote.playerAPI!.delegate = self
    self.appRemote.playerAPI!.subscribe(toPlayerState: { (result, error) in

        if let error = error {
            debugPrint(error.localizedDescription)
        } else if self.pendingSpotifyId != nil {
            self.appRemote.playerAPI!.play(self.pendingSpotifyId, callback: { (any, err) in
                self.pendingSpotifyId = nil
            })
        }
    })
}

我的问题:
每当我尝试启动 session 时,此流程就被破坏了,sessionManager(manager: SPTSessionManager, didFailWith error: Error)总是被调用,返回以下错误:Error Domain=com.spotify.sdk.login Code=1 "invalid_grant" UserInfo={NSLocalizedDescription=invalid_grant}
我需要 session 才能成功启动,以便可以调用sessionManager(manager: SPTSessionManager, didInitiate session: SPTSession),并且可以连接遥控器,并最终播放我的Spotify曲目。

我尝试了什么:
我确保了以下几点:
  • 确保用户设备后台中Spotify应用的状态正在播放(根据此票证:https://github.com/spotify/ios-sdk/issues/31)
  • 确保接收访问 token 时正确的作用域。返回的JSON类似于:
    {"access_token":"###","token_type":"Bearer","expires_in":3600,"refresh_token":"###","scope":"app-remote-control user-read-private"}

  • 我可疑的事情:
    我不知道通过Heroku进行的 token 交换是否正确完成。这是我能想到的唯一原因。如果我能够使用Spotify API,这是否足以证明我的 token 交换已正确完成? (我怀疑是)

    最佳答案

    这是我们发现的内容,希望对您有所帮助:

  • SpotifySDK教程没有提到Bundle IDApp Callback URL必须在App Info.plist,源代码,Spotify App Dashboard和Heroku Env Vars之间精确匹配。使用的Bundle ID必须与您的应用程序Bundle ID相匹配。
  • App Callback URL不得具有空路径,即:my-callback-scheme://spotify-login-callback
  • 在应用程序中同时使用Web Spotify SDK和iOS Framework Spotify SDK时,请确保只有其中一个执行身份验证。否则,App Callback URL将被调用两次,从而导致错误。
  • Spotify configuration.playURI可能需要设置为空字符串,而不是nil。示例应用程序上有一个注释。
  • 最好在应用程序中只有一个对象管理Spotify身份验证的实例。否则,确保从AppDelegate的open url方法中调用正确的对象可能很棘手。
  • 关于ios - Spotify SessionManager连续失败,错误为“invalid_grant”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57332662/

    10-16 16:20