NSWorkspace.OpenConfiguration игнорирует аргументы, несмотря на то, что он не изолирован - PullRequest
2 голосов
/ 14 июля 2020

Я пытаюсь запустить приложение с помощью инструмента open через Swift. У меня есть две отдельные реализации: одна с NSWorkspace.shared.openApplication(at:configuration) для 10.15+ и одна с NSWorkspace.shared.launchApplication(at:options:configuration) для 10.14 и ниже. Все работает нормально на 10.14 и ниже, но Каталина игнорирует любые выдвинутые ей аргументы. Приложение не изолировано.

Реализация для 10.15 +:

let appPath = URL(string: "file:///usr/bin/open")!
let configuration = NSWorkspace.OpenConfiguration()
configuration.arguments = [
    "-a",
    executablePath,
    url.absoluteString
]

NSWorkspace.shared.openApplication(at: appPath, configuration: configuration) { (app, error) in
    if let error = error {
        done(error)
    } else {
        done(nil)
    }
}

Запуск этого приводит к открытию окна Терминала /usr/bin/open без аргументов, а затем закрытию сеанс.

Каталина открывает Терминал

executablePath - это строка исполняемого файла приложения, например, /Application/Safari.app/Contents/MacOS/Safari

url - это объект URL, содержащий ссылку http или https

Удаление file:// из appPath также отлично работает в 10.14, но в 10.15 приводит к The application “open” could not be launched because a miscellaneous error occurred.

Я что-то упускаю?

1 Ответ

0 голосов
/ 16 июля 2020

Я решил эту проблему другим способом. Вместо использования NSWorkspace.shared.openApplication(at:configuration:) я теперь вызываю Process, который открывает open.

Это также работает с версиями ниже Catalina и даже работает с песочницей . Однако в песочнице есть одна загвоздка, подробнее в конце.

Обходной путь

let task = Process()
        
task.arguments = ["-a", executablePath, url.absoluteString]
task.launchPath = "/usr/bin/open"
task.launch()

Нет необходимости ждать процесс, так как а) возврат open не так полезен и б) в любом случае это происходит практически сразу. родительское приложение.

Это означает, что приложение, открытое с использованием Process, имеет ту же песочницу. Если вы используете open, чтобы открыть URL-адрес, как это делаю я, это нормально, потому что open в любом случае порождает новый процесс без нашей песочницы. Однако это означает, что вы не можете использовать это открытое другое обычное приложение, если оно не работает нормально с вашей песочницей.

...