Встроить исполняемый файл в приложение Mac

Если вы перейдете к /usr/bin, вы увидите сотни исполняемых файлов или ссылок на исполняемые файлы.

Мое приложение (приложение для Mac, написанное на Obj-C в Xcode) зависит от некоторых из этих исполняемых файлов. К сожалению, исполняемые файлы должны быть установлены вручную - я должен проверить их, а затем предложить пользователю установить их.

Мой код:

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?


person citruspi    schedule 17.08.2012    source источник
comment
В общем, просто сделайте их частью пакета приложений во время сборки, и все готово. К сожалению, я ничего не знаю о части вопроса о магазине приложений.   -  person Lvsti    schedule 18.08.2012
comment
@Lvsti Что именно ты имеешь в виду? Например, где я должен добавить исполняемый файл? И как мне сделать их частью пакета приложений во время сборки? И как бы я это назвал - каким будет setPathLaunch?   -  person citruspi    schedule 18.08.2012
comment
Я подозреваю, что такие махинации будут не разрешены в магазине приложений, поскольку песочница, скорее всего, не позволит запускать внешние задачи. Другие люди тоже думали над этим вопросом.   -  person Michael Dautermann    schedule 19.08.2012


Ответы (4)


Если вам интересно, в Swift 3 вы можете сделать это:

let bundle = Bundle.main
let task = Process()
let path = bundle.path(forResource: "executableName", ofType: "")
task.launchPath = path
person Maiaux    schedule 02.11.2016

Просто чтобы обновить и уточнить, я обнаружил, что в 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)")
}
person hbowie    schedule 25.01.2020

Хорошо, поэтому я решил найти ответ для себя, поигравшись. И я счастлив сказать, что понял это!

Итак, просто скопируйте executable в проект Xcode куда хотите. Затем измените

[task setLaunchPath:@"/usr/bin/executable"];

to

[task setLaunchPath:[[NSBundle mainBundle] pathForResource:@"executable" ofType:@""]];

И та да!

person citruspi    schedule 18.08.2012

В Swift вы можете сделать это:

let bundle = NSbundle.mainBundle()
let task = NSTask()

task.launchPath = bundle.pathForResource("executableName", ofType: "")

Убедитесь, что связанный исполняемый файл находится на верхнем уровне дерева каталогов, а не в подкаталоге, таком как /lib, иначе он может не работать.

person user43633    schedule 05.06.2016