1

该问题涉及使用“复制到...”与我的应用程序共享文档。

该行动的结果是呼吁:

    //TODO: This is where we save to the documents folder I beleive.
    func application(_ app: UIApplication, open inputURL: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
        // Ensure the URL is a file URL
        guard inputURL.isFileURL else { return false }
        print(#function)

        // Reveal / import the document at the URL
        guard let documentBrowserViewController = window?.rootViewController as? DocumentBrowserViewController else {
            print("DocumentBrowserViewController needs to be RootViewController")
            return false
        }


        documentBrowserViewController.revealDocument(at: inputURL, importIfNeeded: true) { (revealedDocumentURL, error) in

            //TODO: Handle error with alert
            if let error = error {
                print("Error: Failed to reveal the document at URL \(inputURL) with error: '\(error)'")
            } else {
                print("Success.")
            }


            // Present the Document View Controller for the revealed URL
            //documentBrowserViewController.presentDocument(at: revealedDocumentURL!)
        }

        return true
    }

打印语句显示块:documentBrowserViewController.revealDocument被执行而没有错误。

根据文档

如果 importIfNeeded 为真,则文档浏览器在调用完成处理程序之前调用其委托的 documentBrowser( :didImportDocumentAt:toDestinationURL:) 方法(或它的 documentBrowser( :failedToImportDocumentAt:error:) 方法,如果发生错误)。

不过,这两种方法都没有被调用。

笔记:

  • 我已将documentBrowserViewController设置为它自己的委托。
  • 我并不孤单。苹果论坛

我误解了 API 吗?我的目标是在使用(“复制到”)从外部应用程序导入文件时将文件保存到用户文档中。我的计划是这样做: documentBrowser(_:didImportDocumentAt:toDestinationURL:)

4

2 回答 2

1

Apple 在此处的文档表明,与应用程序外部共享的文件放置在用户的 Documents/Inbox 目录中。然后,我怀疑 UIDocumentBrowserViewControllerDelegate 的 didImport/failedToImport 方法在调用revealDocument方法未能被调用的原因是,从应用程序外部共享的文件已经被预先导入(再次导入用户的 Documents/Inbox 目录) revealDocument 方法执行的时间。

不幸的是,开发人员在使用 UIDocumentBrowserViewController 添加将 url 导入基于文档的应用程序的功能时最初可能会看到的任何地方都没有提到“导入文档/收件箱”行为。特别是,它没有在...中提及

(1) “启用文档共享”一文(https://developer.apple.com/documentation/uikit/view_controllers/adding_a_document_browser_to_your_app/enabling_document_sharing

(2) UIApplication 的 openURL:options:completionHandler: 方法或 UIDocumentBrowserViewController 的revealDocumentAtURL:importIfNeeded:completion: 方法的文档。

最好更新 (1) 和 (2) 的文档以反映与应用程序共享的应用程序外部文件(特别是邮件附件)的 Documents/Inbox 目录存储。(最好在 (1) 和 (2) 文档中提到,如果要编辑导入 url 处的文件,则需要先将它们移出 Documents/Inbox 目录。)

于 2019-08-18T23:27:01.693 回答
0

我的猜测是那些UIDocumentBroserViewControllerDelegate api 方法与在文件应用程序中移动文件有关,而不是使用“复制到...”方法导入。我现在没有时间确认,所以我将保持开放状态。以下代码虽然有效。基本上它只是给用户一个对话框来选择导入文件的位置。

/// Presents a Picker alowing the user to select a location to import to.
    func application(_ app: UIApplication, open inputURL: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
        // Ensure the URL is a file URL
        guard inputURL.isFileURL else { return false }

        // Reveal / import the document at the URL
        guard let documentBrowserViewController = window?.rootViewController as? DocumentBrowserViewController else {
            return false
        }


        documentBrowserViewController.revealDocument(at: inputURL, importIfNeeded: true) { (revealedDocumentURL, error) in

            if let url = revealedDocumentURL {

                let inputPicker = UIDocumentPickerViewController(url: url, in: .moveToService)

                /// Present on our Top View Controller
                if let presented = documentBrowserViewController.presentedViewController {
                    ///presented might be presenting it's own. (if so, dismiss it)
                    if let alreadyPresenting = presented.presentedViewController {
                        alreadyPresenting.dismiss(animated: false)
                    }
                    presented.present(inputPicker, animated: true)
                } else {
                    documentBrowserViewController.present(inputPicker, animated: true)
                }
            }


            //TODO: Handle error with alert
            if let error = error {
                print("Error: Failed to reveal the document at URL \(inputURL) with error: '\(error)'")
            }

        }

        return true
    }
于 2019-07-24T16:49:12.200 回答