我正在设置一个应用程序,我想在其中显示和修改存储在 json 文件中的数据。这些文件应该可以通过 sftp 连接到服务器或从 Dropbox 帐户访问。我的应用程序的一部分是一个视图,用户可以在其中选择是应该通过 sftp 还是通过 dropbox 访问文件,并输入 sftp 的必要凭据和要访问的文件名。输入完成后,我将启动一个方法来检查插入的数据并检查与指定源的连接。
如果选择了保管箱,我尝试在此方法中启动授权,如下所示:
if newAccess.credentials.accesstype == .dropbox {
let scopeRequest = ScopeRequest(scopeType: .user, scopes: ["account_info.read"], includeGrantedScopes: false)
DropboxClientsManager.authorizeFromControllerV2(
UIApplication.shared,
controller: self,
loadingStatusDelegate: nil,
openURL: { (url: URL) -> Void in UIApplication.shared.open(url, options: [:], completionHandler: nil) },
scopeRequest: scopeRequest
)
}
我正在使用 Xcode 12.3 并使用 iPhone 8 模拟器进行测试。
Dropbox 的登录工作流程已正确启动,我可以为 Dropbox 输入登录数据并授予访问权限。但是在 Dropbox 视图中允许访问后,视图会保持不变,并且不会跳转回我的应用程序。此外,我收到以下错误:2021-01-16 06:52:20.212331+0100 ..[1805:55943] -canOpenURL: failed for URL: "dbapi-8-emm://1/connect?k=. .........&s =“ - 错误:“Der Vorgang konnte nicht abgeschlossen werden。(OSStatus-Fehler -10814。)
我检查了几个提示,至少不是这个:How to connect Dropbox API to iOS app with Swift 5,但没有解决我的问题。
如果我在安装了 dropboxApp 的 iPhone 上测试我的应用程序,则通过此应用程序缩短的授权工作流程会导致跳转回我的应用程序,但与 Dropbox 的连接未经授权。
在我的保管箱帐户中,我已经注册了我的应用程序并创建了我的应用程序密钥。我请求的权限是“account.info.read”、“files.content.write”和“files.content.read”。
我已经按照 SDK SwiftyDropbox 的文档中的描述更改了 AppDelegate 和 Info.plist:
应用委托:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
DropboxClientsManager.setupWithAppKey(dropboxAppKey) // my key
return true
}
// MARK: UISceneSession Lifecycle
func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
}
func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
}
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
let oauthCompletion: DropboxOAuthCompletion = {
if let authResult = $0 {
switch authResult {
case .success:
print("Success! User is logged into DropboxClientsManager.")
case .cancel:
print("Authorization flow was manually canceled by user!")
case .error(_, let description):
print("Error: \(String(describing: description))")
}
}
}
let canHandleUrl = DropboxClientsManager.handleRedirectURL(url, completion: oauthCompletion)
return canHandleUrl
}
信息列表:
<key>LSApplicationQueriesSchemes</key>
<array>
<string>dbapi-8-emm</string>
<string>dbapi-2</string>
</array>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleIdentifier</key>
<string></string>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>db-...myKey...</string>
</array>
</dict>
</array>
有谁知道我的问题出在哪里?谢谢你的支持。