NSTask только возвращает стандартную ошибку в сборке релиза - PullRequest
1 голос
/ 24 ноября 2011

Прежде всего, при отладке и запуске в Xcode все работает как положено.

Но когда я пытаюсь «поделиться» моим приложением, то есть сделать сборку релиза, мой NSTask не выдает никакого стандартного выхода, покаСтандартные ошибки выложены.Как это возможно?

Мой код

- (id)initWithWindow:(NSWindow *)window {
    self = [super initWithWindow:window];
    if (self) {
        // Initialization code here.
    }
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(readPipe:) name:NSFileHandleReadCompletionNotification object:nil];
    return self;
}


-(void) watchFile:(NSNotification *)notification {
        NSString *path = [[notification userInfo] valueForKey:@"path"];

        task = [[NSTask alloc] init];
        [task setLaunchPath:@"/usr/bin/compass"];
        [task setCurrentDirectoryPath:path];

        NSArray *arguments;
        arguments = [NSArray arrayWithObjects: @"watch",@"--boring", nil];
        [task setArguments: arguments];

        NSPipe *outPipe, *errPipe;
        outPipe = [NSPipe pipe];
        errPipe = [NSPipe pipe];
        [task setStandardOutput: outPipe];
        [task setStandardError: errPipe];
        [task setStandardInput: [NSPipe pipe]];

        standardHandle = [outPipe fileHandleForReading];
        [standardHandle readInBackgroundAndNotify];

        errorHandle = [errPipe fileHandleForReading];
        [errorHandle readInBackgroundAndNotify];

        [self setSplitterPosition:0.0f];

        [task launch];

    }

-(void)readPipe:(NSNotification *)notification {
        NSLog(@"reading pipe");
        NSData *data;
        NSString *text;

        if(!([notification object] == standardHandle) && !([notification object] == errorHandle)) {
            return;
        } 

        data = [[notification userInfo] objectForKey:NSFileHandleNotificationDataItem];
        text = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];

        if ([data length] == 0) {
            //error
            [self setSplitterPosition:150.0f];
            return;
        }

        [terminalViewController updateTerminal:text];    
        if(![text isEqualToString:@"\n"]) [self growlAlert:text title:@"Compapp"];

        [text release];
        if(task) [[notification object] readInBackgroundAndNotify];
    }

Ответы [ 3 ]

0 голосов
/ 24 ноября 2011

Если вы имеете в виду, что после выпуска вы пытаетесь отлаживать, вам нужно создать файл с именем Entitlements.plist и установить его можно отлаживать перед сборкой и архивированием.

0 голосов
/ 07 февраля 2012

, если это все еще открытая проблема для вас, зацените ответ, который я разместил по этой ссылке: Как использовать определенный NSProgressIndicator для проверки прогресса NSTask?- Какао

предоставляет хороший шаблон для создания асинхронной NSTask и для чтения из стандартного вывода или стандартной ошибки.

0 голосов
/ 24 ноября 2011

/usr/bin/compass не является двоичным файлом, установленным в стандартной установке OSX (у меня нет никакого двоичного файла с именем compass в моем /usr/bin на моем Mac)

Так что вполне логично, что когда ваше приложение работает на другом Mac, на котором не установлено /usr/bin/compass, и вы пытаетесь запустить эту задачу, оно не может найти ее и выдает только ошибку на stderr. .

...