iOS 11上的UIDocument创建:不允许读者访问该URL
从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
文件夹,我的查找例程可以validation我的文件是否已成功创建:
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”并且它正确触发我的应用程序打开时,我可以validation我的UTI是否有效。
- 该错误仅出现在iOS 11上 。 相同的代码不会在iOS 10上重现错误,就像上面的问题一样。
- 我尝试添加
UISupportsDocumentBrowser
键,虽然我没有使用浏览器,但它没有解决错误。
发生什么事? 这只是iOS 11上的“噪音”错误消息吗?
如果有人有兴趣,这是我的GitHub在线代码 。
解决方法是通过将数据保存到磁盘来创建文件,然后像使用现有文件一样打开它。
你的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 } }
在Xcode 9.3中,可以在info.plist中指定一个新项:
支持文档浏览器(是)
这样可以访问应用程序的文档目录(例如,设备上的/ var / mobile / Containers / Data / Application / 3C21358B-9E7F-4AA8-85A6-A8B901E028F5 / Documents)。 Apple Developer doc 在这里 。
- Cocoa框架中的属性拷贝是什么意思(就像UITabBar的items属性)
- iOS Safari使用“-webkit-transform”运行内存不足
- Xcode 6 GM创build存档
- UITapGestureRecognizer在UIImageView上工作但在UILabel上没有
- 无法在Xcode中构建错误“已明确标记为不可用”
- UIGraphicsBeginImageContext与CGBitmapContextCreate
- 当应用程序崩溃时,“applicationWillTerminate”或“applicationDidEnterBackground”被调用?
- iOS移动应用程序安全性-第一部分:iOS移动开发人员的最佳实践。
- 国家和国家拨号代码清单,国家名称和国家图标目标C