Не удается получить/импортировать содержимое файла iCloud, выбранного в обозревателе документов iOS 11

64
8

Помимо открытия и сохранения собственных пользовательских документов, мое приложение на основе браузера iOS 11 для документов должно иметь возможность импортировать соответствующий форматированный текстовый файл и преобразовывать его в собственный документ.

Однако при выборе текстового файла в браузере документа приложение может получить доступ к его содержимому (а затем выполнить преобразование) только в том случае, если выбранный файл находится в локальном хранилище, но не может получить доступ к содержимому, когда файл хранится в iCloud,

Упрощенная, прокомментированная версия кода, который я использую для метода documentBrowser(_ controller: UIDocumentBrowserViewController, didPickDocumentURLs documentURLs: [URL]) приведен ниже:

func documentBrowser(_ controller: UIDocumentBrowserViewController, didPickDocumentURLs documentURLs: [URL]) {

guard let sourceURL = documentURLs.first else { return }

// Check extension to verify if it is a custom document
if sourceURL.pathExtension == "mydoc" {

// If it is a custom document, we present it directly
// (the presentDocument method is a standard implementation from Apple docs)
presentDocument(at: sourceURL)

} else {

// Otherwise, we suppose the file is a text file to be imported
// We first create a new document, then try to import the contents of the text file
let url = FileManager().temporaryDirectory.appendingPathComponent("New Document").appendingPathExtension("mydoc")
let doc = MyDocument(fileURL: url)

do {
let textFileContents = try String(contentsOf: sourceURL)
// It works fine if the text file is in local storage
// Here the document model is updated by converting the contents of the text file
// (code omitted, it is actually a method in the MyDocument class)
// ...
} catch {
// Produce error message: cannot access text file
// The error message is always produced if the text file is in iCloud storage!
}

// Save and close the document with standard code, e.g.:
doc.save(to: url, for: .forCreating) { (saveSuccess) in
guard saveSuccess else { return }
doc.close(completionHandler: { (closeSuccess) in
guard closeSuccess else { return }
})

// Reveal and import the document
self.revealDocument(at: url, importIfNeeded: true) { (revealedDocumentURL, error) in
if let error = error {
// Handle the error appropriately
return
}
// Present the Document View Controller for the revealed URL
self.presentDocument(at: revealedDocumentURL!)
}
}
}

Файл info.plist объявляет как пользовательский документ, так и public.text в виде типов документов (с соответствующим рангом роли и обработчика) и настраиваемый документ как экспортированный UTI. Если выбранный файл является настраиваемым документом, все работает отлично, независимо от того, является ли файл локальным или в iCloud.

Поскольку импорт работает, когда файл находится в локальном хранилище, я думал, что это может быть проблема разрешений iCloud, даже если документы Apple для состояния UIDocumentBrowserViewController:

Система автоматически обрабатывает доступ к iCloud для вас; вам не нужно включать ваши приложения iCloud.

Однако попытка добавить возможности iCloud в мои права на приложение не решила проблему (и фактически сделала ее еще хуже, в том смысле, что тот же самый код теперь сохранял вновь созданные документы в контейнере iCloud по умолчанию для приложения, что не является то же самое местоположение iCloud Drive, используемое браузером документов, чтобы все документы стали "невидимыми" для браузера, но я отвлекаюсь...).

Другим "забавным" элементом является то, что я также реализовал UIDocumentPickerViewController в приложении для импорта дополнительного контента из текстового файла в уже открытый пользовательский документ. Используемый мной код в основном такой же, как и выше... и он отлично работает независимо от того, находится ли текстовый файл в локальном хранилище или iCloud! Это может усилить представление о том, что проблема связана с конкретной проблемой разрешения с помощью UIDocumentBrowserViewController.

Итак, вкратце: что я могу сделать для доступа к содержимому текстовых файлов, хранящихся в iCloud, и конвертировать их в пользовательские документы моего приложения? Заранее благодарю вас за любые предложения (и, пожалуйста, будьте осторожны, если есть проблемы с формулировкой вопроса - это мой самый первый вопрос об стековом потоке после нескольких месяцев скрытия!).

спросил(а) 2021-01-19T20:42:24+03:00 6 месяцев, 2 недели назад
1
Решение
78

Я не уверен на 100%, но я считаю, что вам нужно вызвать startAccessingSecurityScopedResource для этого URL, чтобы использовать расширение песочницы, предоставленное вам браузером документов. Не забудьте вызвать stopAccessing только вы закончите, чтобы не stopAccessing ресурсы ядра. Кроме того, если вы на самом деле не редактируете этот документ, вы, возможно, ищете UIDocumentPickerViewController вместо этого? Для пользователя странно открывать файл, а затем редактировать другой. Разве не лучше UX, чтобы начать новый документ, а затем импортировать в него текстовый файл с помощью средства выбора?

ответил(а) 2021-01-19T20:42:24+03:00 6 месяцев, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема