可可应用和控制台应用之间的通信



我有两个应用程序,一个带有UI(Cocoa应用程序)。另一个是控制台应用程序。

我的要求是在 CocoaApp 中获取用户输入并将其传递给 ConsoleApp 并返回值。

我已经尝试过这样的事情,我能够发送和处理数据,但无法返回。我不能使用 NSDistibutedNotification。我用谷歌搜索并发现NSPipe应该可以工作,但我无法理解如何实现和使用管道,请提出建议并帮助理解。

我的代码在这里:

在CocoaApp中:

- (IBAction)addClicked:(id)sender {
    if (self.firstNumber.stringValue.length == 0 || self.secondNumber.stringValue.length ==0) {
        NSLog(@"Enter values in both the fields");
        return;
    }
    NSString *a = self.firstNumber.stringValue;
    NSString *b = self.secondNumber.stringValue;
    NSTask *unixTask = [[NSTask alloc] init];
    [unixTask setArguments:@[a, b]];
    [unixTask setLaunchPath:@"/Users/.../ConsoleApp"];//the path
    [unixTask launch];
}

在控制台应用中:

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSArray *args = [[NSProcessInfo processInfo] arguments];
        NSLog(@"%@", args);
        if(args.count>1){
            Adder *adderObject = [Adder new];
            adderObject.aInt = [args[1] integerValue];
            adderObject.bInt = [args[2] integerValue];
            NSInteger sum = [adderObject addAwithB];
            NSLog(@"Sum = %ld", sum);
        }
    }
    return 0;
}

如果你想对代码签名/沙盒友好,并做任何你想做的事XPC,那么它非常复杂,(至少对我来说!),但这并不重要,因为工作已经为你/我/我们完成了。 谷歌为示例代码项目"SMJobBlessXPC",基于"SMJobBless"示例代码... 它有效,我自己运行过它,尽管胸部有点痛苦 - 确保帮助程序的 plist 在"拥有的工具"键中具有正确的代码签名"通用名称",并且帮助程序的所有名称在帮助程序工具和应用程序的 Info.plist 等中匹配。 如果您不需要签名/装箱,那么我想您仍然可以使用示例代码作为模板,只需取消选中项目构建的签名/装箱方面即可。

最新更新