【问题标题】:UIDocument Creation on iOS 11: reader is not permitted to access the URLiOS 11 上的 UIDocument 创建:不允许阅读器访问 URL
【发布时间】:2018-06-11 11:48:50
【问题描述】:

从 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 的类似问题(123)不同,我没有使用UIDocumentBrowserViewController。我只是创建一个 UIDocument 并自己调用save()Documents 目录。我发现的closest question 使用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,也会出现该错误。请参阅thisthis
  • 当我通过 AirDrop 向我的设备发送“myFile”并正确触发我的应用打开时,我可以验证我的 UTI 是否正常工作。
  • 该错误仅出现在 iOS 11 上。相同的代码不会在 iOS 10 上重现错误,例如 the question above
  • 我尝试添加UISupportsDocumentBrowser 键,虽然我没有使用浏览器,但它并没有解决错误。

发生了什么?这只是 iOS 11 上的“噪音”错误消息吗?

这里是???? my GitHub code online如果有人感兴趣。

【问题讨论】:

  • 我也遇到过这个问题,很想知道一个合适的解决方法。同时,我的解决方法是首先创建文件,然后使用通常的方式打开现有的UIDcument:在createDoc 首先获取一个空文档的数据,调用try data.write(to: url),然后初始化@ 987654343@ 子类并调用open 就可以了。
  • 另请注意,在我的情况下,当您在此处描述的错误弹出时,该文档不是创建的,因此它不仅仅是一个“噪音”错误。跨度>
  • @AdrianSchönig 你能在答案部分发布一些代码吗?虽然这不是“正确”的答案,但它会增加讨论。谢谢。
  • 这里有同样的问题。记录了错误,但已创建文档。
  • 我在 iOS 11.3 模拟器中对此进行了测试:仍然记录了相同的错误,但创建了文档(如上面@Mark 报告的那样)。

标签: ios ios11 uidocument uti document-based


【解决方案1】:

解决方法是通过将文件的数据保存到磁盘来创建文件,然后像打开现有文件一样打开它。

您的 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
  }
}

【讨论】:

    【解决方案2】:

    在 Xcode 9.3 中,可以在 info.plist 中指定一个新项目:

    支持文档浏览器(是)

    这允许访问应用程序的文档目录(例如,设备上的 /var/mobile/Containers/Data/Application/3C21358B-9E7F-4AA8-85A6-A8B901E028F5/Documents)。苹果开发者文档here.

    【讨论】:

      猜你喜欢
      • 2018-02-06
      • 2018-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-08
      • 1970-01-01
      • 2019-01-29
      • 1970-01-01
      相关资源
      最近更新 更多