Установка переменных NSUserAutomatorTask без необходимости рабочих процессов Automator для объявления этой переменной - PullRequest
0 голосов
/ 26 сентября 2018

Я использую NSUserAutomatorTask для запуска файла .workflow, созданного с помощью приложения Automator в macOS 10.13.

Я передаю переменные в рабочий процесс через свойство variables:

https://developer.apple.com/documentation/foundation/nsuserautomatortask/1418099-variables

Родительское приложение находится в песочнице.Сценарий находится в .applicationScriptsDirectory и успешно выполняется, когда переменные не заданы или когда те же переменные установлены в приложении и объявлены в рабочем процессе.

if let workflow = try? NSUserAutomatorTask(url: url) {

    workflow.variables = ["randomVariable": "value"] // NOTE

    workflow.execute(withInput: nil) { (value, error) in
        if let error = error {
            print(error) // No variable named "randomVariable"
        }
    }
}

Рабочий процесс не может быть запущен сошибка:

Нет переменной с именем randomVariable

Однако, если я отредактирую рабочий процесс и добавлю переменную, совпадающую с набором в коде, все будет хорошо.

Add var to workflow

Я больше не получаю сообщение об ошибке, и рабочий процесс выполняется правильно:

Execute workflow

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

Я не хочу требуют , чтобы каждый рабочий процесс объявлял переменные, которые мое приложение будет опционально предоставлять.

Обратите внимание, что в моем примере рабочего процесса переменная никогда не используется.Я не хочу, чтобы было объявлено о дополнительном требовании.

Есть ли способ избежать, чтобы каждый рабочий процесс объявлял переменные, которые мое приложение передает при выполнении рабочего процесса?

Или есть способпроверить, какие переменные объявлен рабочим процессом?Тогда я мог передать только те, которые фактически использовались рабочим процессом.

1 Ответ

0 голосов
/ 26 сентября 2018

Оба метода AMWorkFlow setValue(_:forVariableWithName:) и valueForVariable(withName:) безопасно определяют, установлена ​​ли эта переменная в файле рабочего процесса.

Итак, создайте AMWorkFlow рядом с вашим NSUserAutomatorTask.Устанавливайте только те переменные, которые использует скрипт, как указано в AMWorkFlow:

if let automatorTask = try? NSUserAutomatorTask(url: url) {
    if let varChecker = try? AMWorkflow(contentsOf: url) {
        automatorTask.variables = POSSIBLE_VARIABLES.filter {
            return varChecker.setValue($0.value, forVariableWithName: $0.key)
            // -or- //
            return varChecker.valueForVariable(withName: $0.key) != nil
        }
    }

    automatorTask.execute(withInput: nil, completionHandler: nil)
}

AMWorkFlow вообще не выполняется в Песочнице, поэтому вы должны использовать NSUserAutomatorTask для фактического запускаworkflow.

do {
    try AMWorkflow.run(at: url, withInput: nil)
} catch let error {
    print(error)
}

Automator обнаружил ошибку при запуске этого рабочего процесса:

Приложения в изолированных приложениях не могут использовать Automator.framework для запуска рабочих процессов.

Error Domain = com.apple.Automator Code = 0 «Automator обнаружил ошибку при запуске этого рабочего процесса:« Приложения в изолированных приложениях не могут использовать Automator.framework для запуска рабочих процессов. »« UserInfo = {NSUnderlyingError = 0x604000e498a0 {Error Domain = com.apple.Automator Code = 0 »Приложения-песочницы не могут использовать Automator.framework для запуска рабочих процессов. "UserInfo = {NSLocalizedDescription = Приложения-песочницы не могут использовать Automator.framework для запуска рабочих процессов.}}, NSLocalizedDescription = Automator обнаружил ошибку при запуске этого рабочего процесса: «Приложения-песочницы не могут использовать Automator.framework для запуска рабочих процессов»., NSLocalizedFailureReason = Приложения-песочницы могутне использовать Automator.framework для запуска рабочих процессов.}

...