Какао / Objective-c 'system ();' ведет себя странно - PullRequest
0 голосов
/ 11 октября 2009

Я пытаюсь запустить яблочный скрипт внутри моего приложения Какао, используя систему (); function - строка, которую я передаю функции, работает в терминале, а сам appleScript в порядке, я думаю, что это как-то связано с NSString - кто-нибудь может помочь?

        //add to login items
        NSLog(@"add to login");
        NSString *pathOfApp = [[NSBundle mainBundle] bundlePath];
        NSString *theASCommandLoginItem = [NSString stringWithFormat:@"/usr/bin/osascript -e 'tell application \"System Events\" to make login item at end with properties {path:\"%@\"}'", pathOfApp];
        system(theASCommandLoginItem);
        NSLog(theASCommandLoginItem);

Вот вывод:

2009-10-11 20: 09: 52.803 Говорящий Cloud Notifier [3091: 903] добавить в логин sh: \ 340HH: команда не найдена 2009-10-11 20: 09: 52.813 Говорящий Облачный уведомитель [3091: 903] / usr / bin / osascript -e 'рассказать приложение "Системные события" сделать элемент логина в конце со свойствами {Путь: "/ Users / csmith / Desktop / The Уведомление о говорящем облаке / build / Debug / The Говорящее Облако Notifier.app "} '

При компиляции я также получаю предупреждение:

предупреждение: передача аргумента 1 из 'system' из несовместимого указателя тип

Ответы [ 2 ]

14 голосов
/ 11 октября 2009

Bad

Поскольку ответ newacct уже предлагал вам использовать C-строку вместо NSString для функции system().

Хорошо

Вместо этого используйте NSTask.

Better

Более полезным для вас будет класс NSAppleScript:

NSAppleScript *script;
NSDictionary *errorDict;
NSAppleEventDescriptor *returnValue;
// multi line string literal
NSString *scriptText = @"tell application 'System Events'\n"
                        "make login item at end with properties {path:\"%@\"}\n"
                        "end tell";
scriptText = [NSString stringWithFormat:scriptText, pathOfApp];
script = [[[NSAppleScript alloc] initWithSource:scriptText] autorelease];
returnValue = [script executeAndReturnError:&errorDict];
if (returnValue) {
     // success
} else {
     // failure
}

Best

Посмотрите документацию Apple о том, как зарегистрировать ваше приложение для входа в систему. Есть даже несколько примеров.

4 голосов
/ 11 октября 2009

system() - это функция библиотеки C, которая принимает обычную строку C (char *), а не NSString *.

Вы можете преобразовать NSString в строку C, используя что-то вроде [theASCommandLoginItem UTF8String]

Или вы можете использовать собственный способ запуска команд в Objective-C, например:

[NSTask launchedTaskWithLaunchPath:@"/usr/bin/osascript"
                         arguments:[NSArray arrayWithObjects:@"-e",
                                                             [NSString stringWithFormat:@"tell application \"System Events\" to make login item at end with properties {path:\"%@\"}", pathOfApp],
                                                             nil]];
...