如果你去/usr/bin
,你会看到数百个可执行文件或可执行文件的链接。
我的应用程序(在Xcode中用Obj-C编写的Mac应用程序)依赖于其中一些可执行文件。不幸的是,必须手动安装可执行文件 - 我必须检查它们,然后提示用户安装它们。
我的代码是:
NSTask *task = [[NSTask alloc] init];
[task setLaunchPath:@"/usr/bin/executable"];
NSPipe *pipe = [NSPipe pipe];
[task setStandardOutput:pipe];
NSFileHandle *file = [pipe fileHandleForReading];
[task setArguments:[NSArray arrayWithObjects:sender, target, nil]];
[task launch];
我想知道是否可以在我的应用程序中复制可执行文件,然后从那里调用它。这样,用户就不必为自己获取它。
Mac App Store是否允许这样做?
答案 0 :(得分:1)
万一你想知道,在Swift 3中你可以这样做:
let bundle = Bundle.main
let task = Process()
let path = bundle.path(forResource: "executableName", ofType: "")
task.launchPath = path
答案 1 :(得分:1)
仅需更新和澄清,我发现以下内容可在Xcode 11和Swift 5中使用。
首先,将所需的可执行文件(在我的情况下为pandoc)拖放到我的Xcode项目中。我将其放在名为“ bin”的组/文件夹中。
确保选择希望包含可执行文件的目标!
然后使用以下代码:
let task = Process()
let bundle = Bundle.main
let execURL = bundle.url(forResource: "pandoc", withExtension: nil)
guard execURL != nil else {
print("Pandoc executable could not be found!")
return
}
task.executableURL = execURL!
task.arguments = ["--version"]
do {
try task.run()
print("Pandoc executed successfully!")
} catch {
print("Error running Pandoc: \(error)")
}
答案 2 :(得分:0)
好的,所以我打算通过玩游戏为自己找到答案。并且,我很高兴地说我明白了!
因此,只需将executable
复制到Xcode项目中的任何位置即可。然后,改变
[task setLaunchPath:@"/usr/bin/executable"];
到
[task setLaunchPath:[[NSBundle mainBundle] pathForResource:@"executable" ofType:@""]];
并且ta da!
答案 3 :(得分:0)
在Swift中,你可以这样做:
let bundle = NSbundle.mainBundle()
let task = NSTask()
task.launchPath = bundle.pathForResource("executableName", ofType: "")
确保捆绑的可执行文件位于目录树的顶层,而不是像/ lib这样的子目录,否则它可能无效。