Помимо открытия и сохранения собственных пользовательских документов, мое приложение на основе браузера для документов 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, и преобразовать их в пользовательские документы моего приложения? Заранее благодарим вас за любые предложения (и, пожалуйста, будьте осторожны, если есть проблемы с формулировкой вопроса - это мой самый первый вопрос о stackoverflow после нескольких месяцев скрывания!).