Не удается прочитать стандартный вывод из NSTask в режиме выпуска
Я читаю стандартный вывод NSTask примерно так:
NSPipe *outputpipe = [[NSPipe alloc] init];
NSFileHandle *output = [outputpipe fileHandleForReading];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedOutputFromAlgo:) name:NSFileHandleReadCompletionNotification object:output];
NSTask* task = [[NSTask alloc] init];
[task setLaunchPath:[NSString stringWithFormat:@"%@algo/Algo", kVinylRoot]];
[task setArguments:[NSArray arrayWithObject:plist]];
[task setStandardOutput:outputpipe];
[task setCurrentDirectoryPath:[NSString stringWithFormat:@"%@algo", kVinylRoot]];
[task launch];
[output readInBackgroundAndNotify];
[task waitUntilExit];
...
-(void)receivedOutputFromAlgo:(NSNotification*)notification {
[[notification object] readInBackgroundAndNotify];
NSData* dataOutput = [[notification userInfo] objectForKey:NSFileHandleNotificationDataItem];
NSString* dataString = [[NSString alloc] initWithData:dataOutput encoding:NSStringEncodingConversionAllowLossy];
//Do stuff
}
Это работает очень хорошо, если я запускаю это из Xcode. Я вижу стандартный вывод моей задачи в консоли, и полученный OutputFromAlgo получен несколько раз. Однако, если я архивирую приложение и запускаю его, дважды щелкнув по пакету.app или запустив его из терминала, это не сработает. Я все еще вижу выход задачи через консоль или приложение терминала, если я запускаю его оттуда.
Разве это не считается стандартным выходом в этой точке? Почему бы это не сработало?
Изменить: Я только что попытался отключить оптимизацию в релизе, и это тоже не сработало.
1 ответ
Вам нужно обработать setStandardError, вот так:
[task setStandardError:outputpipe];