Методы NSWorkspace
действительно предназначены для запуска независимых приложений; используйте NSTask
для «запуска другой программы в качестве подпроцесса и ... отслеживания выполнения этой программы» согласно документам.
Вот простой способ запустить исполняемый файл и вернуть его стандартный вывод - он блокирует ожидание завершения:
// Arguments:
// atPath: full pathname of executable
// arguments: array of arguments to pass, or nil if none
// Return:
// the standard output, or nil if any error
+ (NSString *) runCommand:(NSString *)atPath withArguments:(NSArray *)arguments
{
NSTask *task = [NSTask new];
NSPipe *pipe = [NSPipe new];
[task setStandardOutput:pipe]; // pipe standard output
[task setLaunchPath:atPath]; // set path
if(arguments != nil)
[task setArguments:arguments]; // set arguments
[task launch]; // execute
NSData *data = [[pipe fileHandleForReading] readDataToEndOfFile]; // read standard output
[task waitUntilExit]; // wait for completion
if ([task terminationStatus] != 0) // check termination status
return nil;
if (data == nil)
return nil;
return [NSString stringWithUTF8Data:data]; // return stdout as string
}
Возможно, вы не захотите блокировать, особенно если это ваш основной поток пользовательского интерфейса, стандартный ввод и т. Д.