代码之家  ›  专栏  ›  技术社区  ›  pkamb santoshIOS

在不需要自动机工作流声明该变量的情况下设置nsurautomatortask变量

  •  6
  • pkamb santoshIOS  · 技术社区  · 6 年前

    我正在使用 nssurautomatotartask 启动一个 。Workflow file,created via the automator a p p in macos 10.13.

    我正在通过 variables property:将变量传递到工作流。

    < HPF= =“http:///x.///x/p/////NoServer AutoTask/1418099变量”Reop=“NordeFror”> http://Dealp.com/文档/基础/NSULSeAutoCutor任务/ 1418099个变量/p>

    父应用程序是沙盒的。脚本位于 .applicationscriptsdirectory 中,并且在未设置变量或从应用程序设置相同变量并在工作流中声明时成功运行。

    if let workflow=try?nsuserautomatortask(url:url){
    
    workflow.variables=[“randomvariable”:“value”]/注
    
    Workflow.Execute(withinput:nil)(value,error)in
    如果让误差=误差{
    print(错误)//没有名为“randomvariable”的变量
    }
    }
    }
    < /代码> 
    
    

    工作流无法运行,错误为:

    < Buff行情>

    没有名为“randomvariable”的变量

    < /块引用>

    但是,如果我编辑工作流并添加一个与代码中设置的变量相匹配的变量,那么一切都很好。

    我不再得到错误,并且工作流正确执行:

    这是一个问题,因为我想将多个信息作为变量传递给任何潜在的工作流,并让每个工作流单独决定处理每个需要的参数。

    我不想要求每个工作流都声明我的应用程序将选择的变量。

    请注意,在我的示例工作流中,从未使用过变量。我不希望声明它的附加要求。

    是否有任何方法可以避免每个工作流在执行工作流时声明应用程序传递的变量?

    或者,是否有一种方法来检查工作流声明了哪些变量?然后,我只能传递工作流实际使用的工作流。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 回复  |  直到 6 年前
        1
  •  0
  •   pkamb santoshIOS    6 年前

    这个 AMWorkFlow 方法 setValue(_:forVariableWithName:) valueForVariable(withName:) 两者都可以安全地确定该变量是否在工作流文件中设置。

    因此,构建一个 工作流管理系统 在你身边 NSUserAutomatorTask . 只设置脚本正在使用的变量,如 工作流管理系统 :

    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)
    }
    

    工作流管理系统 在沙盒中根本不执行,因此必须使用 苏塞拉托马托塔斯克 以实际运行工作流。

    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运行工作流。工作流。}