从 iOS 11 开始,每次使用UIDocument
API创建新文档时都会遇到以下错误:
[错误] 无法获取项目/var/mobile/Containers/Data/Application/XXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXX/Documents/myDoc-XXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXX.myFile (n)的属性值。
错误:错误域 = NSFileProviderInternalErrorDomain 代码 = 1
“不允许读者访问 URL。”
UserInfo={NSLocalizedDescription=不允许读者访问该 URL。}
与关于 SO 的类似问题(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,也会出现错误。看到这个和这个。
- 当我通过 AirDrop 向我的设备发送“myFile”并且它正确触发我的应用程序打开时,我可以验证我的 UTI 是否正常工作。
- 该错误仅出现在 iOS 11 上。相同的代码不会在 iOS 10 上重现错误,就像上面的问题一样。
UISupportsDocumentBrowser
尽管我没有使用浏览器,但我尝试添加密钥,但它并没有解决错误。
怎么了?这只是 iOS 11 上的“噪音”错误消息吗?
如果有人感兴趣,这是 我的在线 GitHub 代码。