Вот

ая с iOS 11 я столкнулся со следующей ошибкойкаждый раз, когда я создаю новый документ с помощьюUIDocument API:

[ОШИБКА] Не удалось получить значения атрибутов для элемента/var/mobile/Containers/Data/Application/XXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXX/Documents/myDoc-XXXXXXXXX-XXXX-XXXXXXXXX-XXXXXXXXXXIL (x) XMX.

Ошибка: Ошибка Домена = NSFileProviderInternalErrorDomain Код = 1
«Читателю не разрешен доступ к URL».
UserInfo = {NSLocalizedDescription = Читателю не разрешен доступ к URL.}

В отличие от похожих вопросов (1, 2, 3) так на этом я не пользуюсьUIDocumentBrowserViewController, Я просто создаю UIDocument и звонюsave() кDocuments каталог себя.ближайший вопрос Я нашел использованиеUIManagedDocument, Однако в моем случаефайл все еще создан и успешно записан, несмотря на сообщение об ошибке.

Вот суть моей процедуры сохранения:

@IBAction func createDoc(_ sender: Any) {
    let uuid = UUID().uuidString
    let doc = Document(baseName: "myDoc-\(uuid)")
    doc.save(to: doc.fileURL, for: .forCreating) { (completed) in
        if (completed) {
            doc.close(completionHandler: nil)
            self.verifyNumberOfFiles()
        }
    }
}

мойUIDocument Подкласс также почти пуст для простоты этого вопроса:

class Document: UIDocument {    

    let fileExtension = "myFile"

    override init(fileURL url: URL) {
        super.init(fileURL: url)
    }

    /// Convenience method for `init(fileURL:)`
    convenience init(baseName: String) {
        self.init(fileURL: documentsDirectory.appendingPathComponent(baseName).appendingPathExtension(Document.fileExtension))
    }

    override func contents(forType typeName: String) throws -> Any {
        return NSData()
    }

    override func load(fromContents contents: Any, ofType typeName: String?) throws {

    }

}

Я всегда пишуDocuments папку, и моя процедура поиска может проверить, что мои файлы успешно созданы:

public var documentsDirectory: URL {
    return FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last!
}

func loadFileURLs(from dirURL: URL) -> [URL]? {
    return try? FileManager().contentsOfDirectory(at: dirURL, includingPropertiesForKeys: nil)
}

Что я обнаружил до сих пор:

Ошибка появляется, даже когда я уже настроил свой UTI. Видетьэто а такжеэто.Я могу убедиться, что мой UTI работает, когда я отправляю «myFile» на мое устройство через AirDrop, и это правильно вызывает мое приложение для открытия.Ошибка появляется только на iOS 11, Тот же код не воспроизводит ошибку на iOS 10, как ввопрос выше.Я пытался добавитьUISupportsDocumentBrowser ключ, хотя я не использую браузер, но он не устраняет ошибку.

Что случилось? Это просто сообщение об ошибке «шум» на iOS 11?

Вотмой код GitHub онлайн если кому-то интересно.

 Adrian Schönig12 февр. 2018 г., 09:54
Также обратите внимание, что в моем случае документ былне создается, когда появляется ошибка, которую вы описываете здесь, так что это была не просто «шумовая» ошибка.
 Paulo Mattos14 апр. 2018 г., 16:16
Я проверил это в симуляторе iOS 11.3: та же самая ошибка все еще регистрируется, но документ создан (как сообщалось @Mark выше).
 Mark14 февр. 2018 г., 13:09
Та же проблема здесь. Ошибка вошла, но документ создан.
 HuaTham12 февр. 2018 г., 12:55
@ AdrianSchönig Можете ли вы опубликовать код в разделе ответов? Хотя это не «правильный» ответ, это добавило бы к обсуждению. Благодарю.
 Adrian Schönig12 февр. 2018 г., 09:53
Я тоже сталкивался с этим и хотел бы знать, как это исправить. Между тем, мой обходной путь - сначала создать файл, а затем использовать обычный способ открытия существующегоUIDcument: ВcreateDoc сначала получите данные для пустого документа, позвонитеtry data.write(to: url) а затем инициализироватьUIDocument подкласс и вызовopen в теме.

Ответы на вопрос(2)

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

ТвойcreateDoc(_:) Затем метод будет выглядеть так:

@IBAction func createDoc(_ sender: Any) {
  let uuid = UUID().uuidString
  let baseName = "myDoc-\(uuid)"
  let url = documentsDirectory
      .appendingPathComponent(baseName)
      .appendingPathExtension(Document.fileExtension)

  do {
    let emptyFileData = Data()
    try emptyFileData.write(to: url)
    let document = Document(fileURL: url)
    document.open() { completed in
      guard completed else { 
        // handle error
        return 
      }
      doc.close(completionHandler: nil)
      self.verifyNumberOfFiles() 
    }
  } catch {
    // handle error
  }
}

Поддерживает браузер документов (ДА)

Это позволяет получить доступ к каталогу документов приложения (например, / var / mobile / Containers / Data / Application / 3C21358B-9E7F-4AA8-85A6-A8B901E028F5 / Документы на устройстве). Документ разработчика AppleВот.

Ваш ответ на вопрос