Objective c 使用NSWorkspace LaunchApplicationaURL启动应用程序后获取退出状态

Objective c 使用NSWorkspace LaunchApplicationaURL启动应用程序后获取退出状态,objective-c,cocoa,macos,Objective C,Cocoa,Macos,我是Mac编程的新手。我正在将一个插件移植到OSX。我需要我的应用程序启动第二个应用程序(我不控制其源代码),然后获取其退出代码。NSWorkspace LaunchApplicationaURL使用所需的参数启动它非常有效,但我看不到如何获取退出代码。在设置终止第二个应用程序的通知后,是否有办法获得该通知?我看到了使用NSTask获取退出代码的工具。我应该使用它吗?NSWorkspace方法实际上是用于启动独立应用程序的;使用NSTask按照文档“将另一个程序作为子进程运行并…监视该程序的执行

我是Mac编程的新手。我正在将一个插件移植到OSX。我需要我的应用程序启动第二个应用程序(我不控制其源代码),然后获取其退出代码。NSWorkspace LaunchApplicationaURL使用所需的参数启动它非常有效,但我看不到如何获取退出代码。在设置终止第二个应用程序的通知后,是否有办法获得该通知?我看到了使用NSTask获取退出代码的工具。我应该使用它吗?

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
}

您可能不想阻止,尤其是如果这是您的主UI线程、提供标准输入等。

事实上,NSTask的此属性应该起到以下作用:terminationStatus

来自苹果的文档:

返回接收器的可执行文件返回的退出状态

  • (int)终止状态
我测试了它,它工作正常。注意测试任务是否首先运行,否则将启动异常

if (![aTask isRunning]) {
    int status = [aTask terminationStatus];
    if (status == ATASK_SUCCESS_VALUE)
        NSLog(@"Task succeeded.");
    else
        NSLog(@"Task failed.");
}

希望有帮助。

非常感谢!我得到了一个使用NSTask的更基本的版本,但这非常有用。我的困惑在于NSTask与NSWorkspace的相对用途。不知何故,我给人的印象是NSWorkspace正在取代NSTask。谢谢,最后一行我改为返回[[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]autorelease],因为应用程序崩溃了