在Mac应用程序中嵌入可执行文件

时间:2012-08-17 20:31:13

标签: objective-c macos embed executable mac-app-store

如果你去/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是否允许这样做?

4 个答案:

答案 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这样的子目录,否则它可能无效。