NSTask:启动app时无法解决posix_spawn:错误13

时间:2016-06-30 20:23:07

标签: xcode swift macos nstask

我的主Swift应用程序中有一个子应用程序。我做了它,因此它在构建它时会自动复制到主应用程序的Resources文件夹中。这样,我希望能够从主应用程序启动子应用程序的实例。

问题是,我有一个很难调试/找到答案的错误。

这是我的代码:

    let args = ["--args", "-admin_url", site.url, "-login", site.login, "-pass", site.password]
    let helperPath = (NSBundle.mainBundle().pathForResource("App Helper", ofType: "app"))!
    let task = NSTask.init()
    task.launchPath = helperPath
    task.arguments = args
    task.launch()

错误:

[56490:7218926] Couldn't posix_spawn: error 13

我不知道在哪里寻找,搜索什么。我不知道自己做错了什么。 我想知道这个问题是否与子应用程序本身有关。那个子应用程序现在是空的。我将Application is Agent设置为YES。在MainMenu.xib中,我将Visible at launch选项设置为no。 该子应用程序需要在后台完成一些工作,并且根本不需要任何UI。

谢谢!

3 个答案:

答案 0 :(得分:1)

请勿使用NSTask,请使用NSWorkspace

let helperAppURL = NSBundle.mainBundle().URLForResource("App Helper",
                                      withExtension:"app")!

_ = try? NSWorkspace.sharedWorkspace().openURL(helperAppURL,
       options:[.Default],
   configuration:[NSWorkspaceLaunchConfigurationArguments :
            ["--args", "-admin_url", site.url, "-login",
             site.login, "-pass", site.password]])

在上面的代码中,为简洁起见,我忽略了openURL()命令的结果,但实际上它可以返回代表任务的NSRunningApplication实例。

要跟踪您启动的帮助应用程序的实例,您可以在适当类型的集合类中保留对此NSRunningApplication的引用,并在时间到来时调用其terminate()方法。

答案 1 :(得分:0)

.app个文件不是可执行的二进制文件。它们是具有特殊功能的文件夹(例如具有图标,并具有打开可执行文件的默认打开操作。您可以通过右键单击.app文件并单击{{1}来自行查看}。

您可以使用Show Package Contents打开应用程序,或打开[open][1] -a

上的实际可执行文件
YourApp.app/Contents/MacOS/YourApp

答案 2 :(得分:0)

不推荐使用 val jsonParser = JsonParser() val jsonObject = jsonParser.parse("your jsonString with backslash").asJsonObject 函数,使用 launch()

run()

或使用 swift-commands

func shell(_ command: String) -> String {
  let task = Process()
  task.launchPath = "/usr/bin/"
  task.arguments = ["-c", command]
  
  let pipe = Pipe()
  task.standardOutput = pipe
  
  if #available(macOS 10.13, *) {
    try? task.run()
  } else {
    task.launch()
  }
  
  let data = pipe.fileHandleForReading.readDataToEndOfFile()
  let output: String = NSString(data: data, encoding: String.Encoding.utf8.rawValue)! as String
  
  return output
}