Папка документа iOS не является каталогом и / или отсутствует - PullRequest
0 голосов
/ 02 мая 2018

Попытка заархивировать массив из 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 так:

Файл: /// Users / имя_пользователя / Library / Developer / CoreSimulator / Devices / DeviceId / данные / документы

но при поиске по папкам я не вижу папки / Documents . Что-то изменилось в последнее время? Раньше работал несколько недель назад (уверен). Очень раздражает, и я не могу найти обходного пути / исправить это.

Ответы [ 3 ]

0 голосов
/ 02 мая 2018

Вы не можете (перезаписать) каталог Documents, вам необходимо добавить имя файла.

А почему вы архивируете данные? Вы можете записать данные списка свойств непосредственно на диск.

И никогда печатать бессмысленную литеральную строку в предложении catch, печатать хотя бы фактическую ошибку.

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)
}
0 голосов
/ 12 июня 2018

Это происходит в симуляторах под управлением iOS 11.x и выше.

Перед iOS 11 симулятор создал глобальную (независимую от приложения) папку «Документы» при запуске. Начиная с iOS 11.x (не знаю, была ли это специальная версия), этого больше не происходит.

Помните, что NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first возвращает этот глобальный путь к документам только в (модульных) тестах, а не при запуске приложения. Если вы запустите приложение, вы получите специальную папку документов приложения, которая все еще создается при установке приложения в симуляторе.

Это похоже на ошибку со стороны Apple. Если вы столкнулись с этой проблемой (как вам кажется), пожалуйста, отправьте сообщение об ошибке на https://developer.apple.com/bug-reporting/.

0 голосов
/ 02 мая 2018

Я считаю, что это новая функция симуляторов iOS - не все обычные каталоги существуют при первоначальной установке приложения.

К счастью, их легко создать, например, для каталога 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)
}
...