0

我正在设置一个应用程序,我想在其中显示和修改存储在 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>

有谁知道我的问题出在哪里?谢谢你的支持。

4

1 回答 1

0

我可以同时解决这个问题。

在 SceneDelegate 中必须添加以下代码:

func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
    if let url = URLContexts.first?.url {
        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))")
              }
          }
        }
        DropboxClientsManager.handleRedirectURL(url, completion: oauthCompletion)
    }
}

另外:必须从当前活动视图启动保管箱连接的初始化。在我的情况下,我想在 SplitScreenMode 的 iPad 版本上使用它,并从 DetailViewController 上模态显示的视图启动保管箱的文件夹概述。连接必须从模式视图启动,而不是通过 DetailViewController 中的方法启动

于 2021-02-05T05:27:55.153 回答