Alison E.E.
Alison E.E.

Reputation: 206

How to run an Automator Workflow/Service from Cocoa app?

So I tried learning Swift well enough to recreate my programs in it, didn't work so well and I didn't get very far. Tried running my C++ functions from Obj-C++ source by calling the functions, didn't work and the project refused to open again after the first time I closed it. I don't find object oriented programming very intuitive in the first place so I'd like to avoid Obj-C.

I already have both an Automator standalone workflow and a Service (that do the same thing) which is get the programs I need, display confirmation, run the program in a terminal window with stdout, and display a notification before exiting. This is everything I need it to do when a specific button is pressed.

So how would I go about linking this button to an Automator func run() block in Swift? I know the command that needs to be used but like I said I don't find object oriented programming very intuitive so I need to know the context in which that function is used. Would following block be enough in practice or would it need more specification?

@IBOutlet weak var testButton(NSButton!)
@IBAction testButton(_ sender: AnyObject)
  {
   let guard Bundle.main.path(forName: "test",forType:"workflow")
   else
     {
      print("Could not find 'test.workflow'")
      return
     } 
   let URL="//location of file"
   class func run(at: URL, withInput: nil)
  }

Am I missing something about how to do this or is the above enough? Secondarily can someone please give an example as to the format of a file URL where the file is located in the bundles "Resources" folder? Also would the class remain the word class or should I be specifying a custom class? Can someone please give me a realworld example of this block/concept in practice?

Upvotes: 2

Views: 861

Answers (1)

Jim Matthews
Jim Matthews

Reputation: 1191

Here's a testButton function that should work:

@IBAction func testButton(_ sender: AnyObject) {
    guard let workflowPath = Bundle.main.path(forResource: "test", ofType: "workflow") else {
        print("Workflow resource not found")
        return
    }

    let workflowURL = URL(fileURLWithPath: workflowPath)
    do {
        try AMWorkflow.run(at:workflowURL, withInput: nil)
    } catch {
        print("Error running workflow: \(error)")
    }
}

Notes:

  1. You need to import Automator at the top of your source file in order for the Swift compiler to recognize the AMWorkflow class
  2. You need to add test.workflow to your project

Upvotes: 1

Related Questions