UIDocumentBrowserViewController.revealDocument не работает должным образом

Проблема связана с предоставлением доступа к документу моему приложению с помощью функции «Копировать в ...».

Результатом этого действия является призыв:

    //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 имеет значение true, браузер документов вызывает метод documentBrowser (: didImportDocumentAt: toDestinationURL :) своего делегата (или его метод documentBrowser (: failedToImportDocumentAt: error :), если произошла ошибка) перед вызовом обработчика завершения .

Однако ни один из этих двух методов не вызывается.

ПРИМЕЧАНИЯ:

  • Я установил documentBrowserViewController в качестве собственного делегата.
  • Я не одинок. Форум Apple.

Я неправильно понимаю API? Моя цель - сохранить файл в пользовательских документах, когда он импортируется из внешнего приложения с помощью («копировать в»). Я планировал сделать это за: documentBrowser(_:didImportDocumentAt:toDestinationURL:)


person hidden-username    schedule 24.07.2019    source источник


Ответы (2)


документация Apple здесь указывает, что файлы, к которым приложению предоставлен доступ извне, помещаются в папку Documents / Inbox пользователя. Я подозреваю, что причина того, что методы didImport / failedToImport UIDocumentBrowserViewControllerDelegate не могут быть вызваны после вызова метода detectDocument, заключается в том, что файлы, к которым был предоставлен общий доступ извне приложения, уже ранее был импортирован (опять же, в каталог Documents / Inbox пользователя) к моменту выполнения метода detectDocument.

К сожалению, это поведение «импорт в Documents / Inbox» не упоминается ни в одном из мест, которые разработчики изначально могут искать, когда добавляют функциональные возможности для импорта URL-адресов в приложение на основе документов с помощью UIDocumentBrowserViewController. В частности, он не упоминается в ...

(1) Статья «Включение совместного использования документов» (https://developer.apple.com/documentation/uikit/view_controllers/adding_a_document_browser_to_your_app/enables_document_sharing).

(2) Документация для метода openURL: options: завершенияHandler: UIApplication или метода ShowDocumentAtURL: importIfNeeded: завершения: UIDocumentBrowserViewController.

Было бы хорошо, если бы документация для пунктов (1) и (2) была обновлена, чтобы отразить в каталоге Documents / Inbox файлы, хранящиеся вне приложения (в частности, почтовые вложения), совместно используемые с приложением. (Также было бы хорошо упомянуть в документации (1) и (2), что если файлы по импортированным URL-адресам должны быть отредактированы, их нужно сначала переместить из каталога Documents / Inbox.)

person chmohler    schedule 18.08.2019

Я предполагаю, что эти методы API UIDocumentBroserViewControllerDelegate связаны с перемещением файлов в приложении для работы с файлами, а не с импортом с помощью метода «Копировать в ...». У меня нет времени подтверждать прямо сейчас, поэтому я оставлю это открытым. Однако следующий код работает. По сути, это просто дает пользователю диалоговое окно для выбора, куда импортировать файл.

/// 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
    }
person hidden-username    schedule 24.07.2019