我的主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。
谢谢!
答案 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
}