2012-08-27 87 views
1

我想從沙盒AppKit應用程序執行Automator工作流程。使用AMWorkflow和沙盒應用程序

小例子+ github repo

NSOpenPanel * panel = [NSOpenPanel openPanel]; 
    [panel setAllowsMultipleSelection:NO]; 
    [panel setCanChooseFiles:YES]; 
    [panel setCanChooseDirectories:NO]; 
    [panel setAllowedFileTypes:[NSArray arrayWithObject: @"com.apple.automator-workflow"]]; 
    NSInteger result = [panel runModal]; 

    if (result == NSFileHandlingPanelOKButton) { 
     NSURL * workflow = [[panel URLs]objectAtIndex:0]; 
     NSLog(@"selected url %@", workflow); 
     NSError * error = nil; 
     [AMWorkflow runWorkflowAtURL:workflow withInput:[NSArray arrayWithObject:workflow] error:&error]; 
     if(error) { 
      NSLog(@"Error while executing workflow %@", [error localizedDescription]); 
     }   
    } 

從我目前的AMWorkflow API的理解,我認爲它使用馬赫IPC在一個單獨的Automator亞軍過程中執行工作流。

這就是爲什麼我添加了以下權利,以我的應用程序:

<key>com.apple.security.temporary-exception.mach-lookup.global-name</key> 
    <array> 
    <string>com.apple.AutomatorRunner</string> 
    <string>com.apple.Automator</string> 
    </array> 

但很顯然的Automator亞軍嘗試重新連接到調用應用程序,它失敗,出現以下錯誤信息:

Automator Runner(2717) deny mach-lookup /Users/pbrc/Library/Developer/Xcode/DerivedData/AMWorkflowCaller-arjgkslqihljquelyvybmpsnljrn/Build/Products/Debug/AMWorkf 

0 libsystem_kernel.dylib   0x00007fff96ce9686 mach_msg_trap + 10 
1 liblaunch.dylib     0x00007fff8db637c4 
2 liblaunch.dylib     0x00007fff8db624d9 bootstrap_look_up3 + 69 
3 liblaunch.dylib     0x00007fff8db62609 bootstrap_look_up2 + 40 
4 Foundation      0x00007fff8f4acffe -[NSMachBootstrapServer portForName:options:] + 102 
5 Foundation      0x00007fff8f4b84cb +[NSConnection connectionWithRegisteredName:host:usingNameServer:] + 30 
6 Automator Runner    0x0000000100001a51 -[AMRunnerDelegate processArguments] + 487 

有任何想法嗎?

回答

1

簡單的答案是AMWorkflow API在沙盒應用程序中不起作用。還有最近已經推出了替代的API,它與沙盒應用程序的工作原理:

NSUserAutomatorTask executeWithInput:completionHandler: 

使用這個API,你可以執行位於應用程序的腳本文件夾的Automator腳本:

/用戶/ USERNAME/Library/Application Scripts/BUNDLENAME.APPNAME

有一個重要警告:儘管該方法的「輸入」參數沒有輸入將傳遞到10.8.3 12D75之前的Mac OS版本的自動工作流程是/是一個錯誤):

NSUserAutomatorTask * task = [[NSUserAutomatorTask alloc] initWithURL:workflow error:&error]; 
    if(error) { 
     NSLog(@"Error while creating script task %@", [error localizedDescription]); 
    } 

    [task executeWithInput: @"this will never reach your workflow" completionHandler:^(id result, NSError *error){ 
     if(error) 
      NSLog(@"Error while executing workflow %@", [error localizedDescription]); 
    }];