Swift中调用/oauth2/token用client_secret兑换Dropbox访问令牌方法
问题排查及修复方案
核心错误点
- 没必要手动拼接授权URL:SwiftyDropbox的
authorizeFromControllerV2方法会自动生成合规的授权链接,你重写了openURL闭包跳转到自行拼接的链接,反而跳过了SDK内置的授权码接收、自动兑换token的逻辑,这是authorizedClient为nil的核心原因。 - 授权流程是异步的:你在调用授权方法后立刻执行
getImageFromDropbox,此时用户还没完成授权操作,必然拿不到有效client。 - 缺少授权回调处理:没有在AppDelegate/SceneDelegate里处理Dropbox的跳转回调,SDK没法拿到返回的授权码,自然不会自动兑换成访问令牌。
- 不需要手动调用
/oauth2/token接口:SwiftyDropbox已经内置了授权码换令牌的全流程逻辑,只要配置正确,SDK会自动完成令牌的兑换、存储、有效期刷新等操作。
具体修复步骤
1. 修正授权调用代码
删除自行拼接的授权URL和自定义跳转逻辑,使用SDK默认实现:
func actionDropboxLogin() { if (DropboxClientsManager.authorizedClient != nil) { //用户已授权,直接拉取文件 self.getImageFromDropbox(path: "", isBack: false) } else { let scopeRequest = ScopeRequest(scopeType: .user, scopes: ["account_info.read files.content.read files.content.write files.metadata.read file_requests.read"], includeGrantedScopes: false) DropboxClientsManager.authorizeFromControllerV2( UIApplication.shared, controller: self, loadingStatusDelegate: nil, // 不要自定义openURL闭包,使用SDK默认跳转逻辑 openURL: { $0.open($1, options: [:], completionHandler: nil) }, scopeRequest: scopeRequest ) // 删掉此处的getImageFromDropbox调用,授权成功后再触发 } }
2. 添加授权回调处理
根据项目的生命周期管理方案选择对应代码:
适配iOS 12及以下(使用AppDelegate)
在AppDelegate.swift中添加回调处理方法:
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { if DropboxClientsManager.handleRedirectURL(url) { // 授权成功,发送通知触发文件拉取 NotificationCenter.default.post(name: NSNotification.Name("DropboxAuthSuccess"), object: nil) return true } return false }
适配iOS 13及以上(使用SceneDelegate)
在SceneDelegate.swift中添加回调处理方法:
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) { guard let url = URLContexts.first?.url else { return } if DropboxClientsManager.handleRedirectURL(url) { NotificationCenter.default.post(name: NSNotification.Name("DropboxAuthSuccess"), object: nil) } }
3. 监听授权成功通知,触发文件拉取
在当前ViewController的viewDidLoad中添加通知监听,授权完成后再调用文件拉取逻辑:
override func viewDidLoad() { super.viewDidLoad() // 监听Dropbox授权成功通知 NotificationCenter.default.addObserver(self, selector: #selector(handleDropboxAuthSuccess), name: NSNotification.Name("DropboxAuthSuccess"), object: nil) self.actionDropboxLogin() } @objc func handleDropboxAuthSuccess() { // 授权完成后再拉取Dropbox文件 self.getImageFromDropbox(path: "", isBack: false) }
4. 确认基础配置
检查项目Info.plist中已添加URL Scheme,格式为db-<你的应用client_id>,需和Dropbox控制台填写的redirect_uri规则完全匹配。
内容的提问来源于stack exchange,提问作者Stephy
相关产品推荐
相关产品推荐

