Hua*_*ham 12 document-based uti ios uidocument ios11
从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.}
不同于类似的问题(1,2,3上SO)在此,我没有使用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()
}
}
}
Run Code Online (Sandbox Code Playgroud)
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 {
}
}
Run Code Online (Sandbox Code Playgroud)
我总是写入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)
}
Run Code Online (Sandbox Code Playgroud)
到目前为止我发现了什么:
UISupportsDocumentBrowser
密钥虽然我没有使用浏览器,但它没有解决错误.怎么了?这只是iOS 11上的"噪音"错误消息吗?
解决此问题的方法是将其数据保存到磁盘来创建文件,然后像打开现有文件一样打开它。
你的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
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2069 次 |
最近记录: |