Используйте относительный путь с аргументами NSTask в Objective- C - PullRequest
0 голосов
/ 25 февраля 2020

У меня практически нет опыта программирования, кроме сценариев оболочки, но я нахожусь в ситуации, когда мне нужно вызвать двоичный файл с launchd и из-за изменений безопасности в Catilina выглядит так, как будто это не может быть AppleScript .app, Automator .app, или Утконос .app. Все три из них вызывают какой-то элемент GUI, и ни один из них не будет работать, как при запуске.

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

Как я могу назвать эквивалент

[task setArguments:@[ @"../Resources/script" ]];

вместо

[task setArguments:@[ @"/Full/Path/To/script" ]];

Ниже приведен общий объем main.m

#import <Foundation/Foundation.h>
enter code here
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
       NSTask *task = [[NSTask alloc] init];
        [task setLaunchPath:@"/bin/zsh"];
        [task setArguments:@[ @"/Full/Path/To/script" ]];
        [task launch];
    }
    return 0;
}

Кроме того, я знаю, что есть гораздо лучшие способы сделать это, но моя цель не в том, чтобы иметь удостоенное наград приложение, а просто в решении конкретной проблемы c. Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 26 февраля 2020

Вы должны использовать NSBundle для этого. В частности, вы должны использовать:

[[NSBundle mainBundle] pathForResource:@"script" ofType:nil]

как в:

[task setArguments:@[ [[NSBundle mainBundle] pathForResource:@"script" ofType:nil] ]];
0 голосов
/ 25 февраля 2020

Вы получаете текущий каталог с NSFileManager

NSString* path = [[NSFileManager defaultManager] currentDirectoryPath];

Первый аргумент в argv - это путь к двоичному файлу

Либо

NSString *path = [NSString stringWithUTF8String:argv[0]];

или

NSString *path = [[NSProcessInfo processInfo] arguments][0];
...