Мое изолированное приложение для macOS импортирует файлы изображений, выбранные пользователем, через NSOpenPanel
модальное окно, как это обычно бывает.
Сначала я настроил панель на canChooseDirectories = false
, а для свойства allowedFileTypes
установил значение NSImage.imageTypes
. Все идет нормально.
Используя приложение, я понял, что изображения, которые я хочу импортировать, чаще всего сгруппированы внутри папки, в которой больше ничего нет. Было бы здорово, если бы пользователь мог просто выбрать содержащую папку и импортировать изображения в рамках «оптовой продажи», поэтому я принял этот код:
let panel = NSOpenPanel()
panel.allowsMultipleSelection = true
panel.canChooseDirectories = true
panel.canCreateDirectories = false
panel.canChooseFiles = true
panel.allowedFileTypes = NSImage.imageTypes
panel.begin { [unowned self] (result) in
guard result == .OK else {
return // User cancelled
}
// Read all selected images:
let urls: [URL] = {
if let directory = panel.directoryURL {
// .........................................
// [A] One directory selected:
do {
let urls = try FileManager.default.contentsOfDirectory(at: directory, includingPropertiesForKeys: nil, options: [])
return urls
} catch {
// (I ALWAYS END UP HERE)
print(error.localizedDescription)
return []
}
} else {
// .........................................
// [B] One or more files selected:
return panel.urls
}
}()
// (next: read individual urls...)
...но оператор try
всегда терпит неудачу, выполняется блок catch
и выдается следующая ошибка:
«Не удалось открыть файл «MyImageFolder», поскольку у вас нет разрешения на его просмотр».
Есть ли способ обойти это для изолированных приложений? Все, что я забыл, что позволит мне прочитать содержимое выбранной пользователем папки?
Дополнение: документация Apple гласит:
Когда пользователь вашего приложения указывает, что он хочет использовать файл или папку, система добавляет соответствующий путь в песочницу вашего приложения. Скажем, например, пользователь перетаскивает папку ~/Documents на плитку Dock вашего приложения (или на значок Finder вашего приложения, или в открытое окно вашего приложения), тем самым показывая, что он хочет использовать эту папку. В ответ система делает папку ~/Documents, ее содержимое и вложенные папки доступными для вашего приложения.
(выделено мной)