Откройте каталог загрузок с Finder, запрашивая разрешение пользователя, если это необходимо - PullRequest
0 голосов
/ 18 апреля 2020

Я создаю клиент BitTorrent, где я даю пользователю возможность через контекстное меню открыть каталог, содержащий торрент.

Для этого я попытался использовать метод open(_) экземпляр NSWorkspace выглядит так:

NSWorkspace.shared.open(directory)

, где directory - экземпляр URL, указывающий на каталог, например:

let directory = URL(fileURLWithPath: item.parentPath, isDirectory: true)

Здесь item.parentPath - это Строка, содержащая абсолютный путь.

Теперь позвольте мне прояснить, что код работает нормально. Он успешно открывает нужные мне каталоги внутри Finder (поскольку это приложение по умолчанию для открытия каталогов).

Однако, если каталог является каталогом Downloads пользователя, он отображает это приглашение:

Operation rejected due to lack of permissions.

Опять же, все в порядке, поскольку мое приложение не имеет разрешения на открытие каталога Downloads . Однако я хочу попытаться открыть каталог, запрашивая разрешение, как и любое другое приложение в macOS, например:

Prompting for permission.

Я посмотрел вверх в документах и ​​нашел этот метод NSWorkspace: open(_:withApplicationAt:configuration:completionHandler:). Я подумал, что это здорово, поскольку я мог установить для свойства promptsUserIfNeeded экземпляра NSWorkspace.OpenConfiguration значение true , что, как я считаю, должно заставить мое приложение вежливо запросить разрешение на открытие каталога, если это необходимо.

Вот мой полученный код:

let url = URL(fileURLWithPath: item.parentPath, isDirectory: true)

let configuration: NSWorkspace.OpenConfiguration = NSWorkspace.OpenConfiguration()
configuration.promptsUserIfNeeded = true

let finder = NSWorkspace.shared.urlForApplication(withBundleIdentifier: "com.apple.finder")

// Open file with default application
NSWorkspace.shared.open([url], withApplicationAt: finder!, configuration: configuration)

К сожалению, это не имеет значения. Я все еще получаю тот же диалог, что и на первом изображении.

Я хочу знать две вещи:

  1. Что я делаю не так?
  2. Как я могу открыть каталог, запрашивая разрешения при необходимости?

1 Ответ

2 голосов
/ 22 апреля 2020

Полагаю, вы хотите, чтобы все это прекрасно играло в песочнице. У вас есть два варианта:

  1. Использовать activateFileViewerSelecting(_:) или selectFile(_:inFileViewerRootedAtPath:). Любой из них будет запрашивать разрешение, и после получения вы можете вернуться к использованию open(_:withApplicationAt:configuration:completionHandler:), если вы так * * * * *. * * * * * * * * * * * * * * * * * * * * Закладки в области безопасности и доступ к постоянным ресурсам .

...