iOS 文档文件夹不是目录 and/or 丢失

iOS Document folder is not a directory and/or is missing

正在尝试归档 Codable 个元素的数组。

do {
   let data = try PropertyListEncoder().encode(elements)
   let success = NSKeyedArchiver.archiveRootObject(data, toFile:self.archiveURL.path)
   print(success ? "Successful save" : "Save Failed")
} catch {
   print("Save Failed")
}

由于某种原因,路径 (archiveURL) 经常出错:

let archiveURL = FileManager().urls(for: .documentDirectory, in: .userDomainMask).first!

总是像这样返回 URL:

file:///Users/userName/Library/Developer/CoreSimulator/Devices/deviceID/data/Documents

但搜索文件夹时我没有看到 /Documents 文件夹。最近有什么变化吗?几周前它曾经工作过(很确定)。超级烦人,我找不到任何 workaround/fix。

我相信这是 iOS 模拟器的(新式)"feature" - 最初安装应用程序时,并非所有常用目录都存在。

幸运的是,创建它们很容易,例如对于 applicationSupport 目录,我在我的应用程序中这样做:

let fileManager = FileManager.default
let directory = NSSearchPathForDirectoriesInDomains(.applicationSupportDirectory, .userDomainMask, true).first!
if !fileManager.fileExists(atPath: directory) {
  try fileManager.createDirectory(atPath: directory, withIntermediateDirectories: true, attributes: nil)
}

您不能(覆盖)写入 Documents 目录,您必须附加一个文件名。

为什么要存档数据?您可以将 属性 列表数据直接写入磁盘。

并且never evercatch子句中打印无意义的文字字符串,至少打印实际错误。

let fileName = "myPropertyList.plist"
let fileURL = archiveURL.appendingPathComponent(fileName)
do {
   let data = try PropertyListEncoder().encode(elements)
   try data.write(to: fileURL)
} catch {
   print("Save Failed", error)
}

这发生在模拟器 运行ning iOS 11.x 及更高版本中。

在 iOS11 之前,模拟器在启动时创建了全局(独立于应用程序)文档文件夹。自从iOS11.x(不知道是不是特别点发布)以后就不会再出现了。

请注意 NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first returns 此全局文档路径仅在(单元)测试中,而不是在 运行 应用程序中。如果您 运行 该应用程序,您将获得应用程序特定的文档文件夹,该文件夹在模拟器中安装该应用程序时仍会创建。

这似乎是苹果方面的一个错误。如果您 运行 遇到这个问题(您似乎遇到了),请在 https://developer.apple.com/bug-reporting/.

提交错误报告