我似乎在理解Cocoa中的NSTask时遇到了一些麻烦。我想要启动的应用程序是openSSL。目前,我能够发送信息(发布路径,参数等),我也可以使用NSPipe获得响应。我需要做的是响应应用程序要求的输入请求。使用以下代码,我可以发送和读取文件中的响应:
NSTask *task;
task = [[NSTask alloc] init];
[task setLaunchPath: launchPath];
[task setArguments: arguments];
[task setCurrentDirectoryPath:dir];
NSPipe *pipe;
pipe = [NSPipe pipe];
[task setStandardOutput: pipe];
NSFileHandle *file;
file = [pipe fileHandleForReading];
[task launch];
NSData *data;
data = [file readDataToEndOfFile];
NSString *response = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
一旦我启动NSTask,我应该提供域名,国家等等。我的问题的原因是因为我需要能够使用openSSL生成证书签名请求并发送它,以及一些其他数据,到服务器。上面的代码没有被破坏,我只是不确定如何发送该输入。
另外,如果有人在Cocoa / ObjC上使用了某种openSSL实现,并认为这比使用NSTask更好,我也完全对此持开放态度。
先谢谢。
答案 0 :(得分:2)
并非任何人都在考虑这个问题,但如果你是,并且还不知道答案,我找到了解决办法,但结果却采用了不同的方法。我只是传递-subj参数而不是发送额外的输入。但是,我最初要求的解决方案如下:
NSTask *task = [[NSTask alloc] init];
NSString *tmpdir=NSTemporaryDirectory();
[task setCurrentDirectoryPath:tmpdir];
[task setLaunchPath:@"/usr/bin/openssl"];
NSArray *sslarguments=@[@"req",@"-nodes",@"-newkey",@"rsa:2048",@"-keyout",@"myserver.key",@"-out",@"server.csr"];
[task setArguments:sslarguments];
NSPipe * in = [NSPipe pipe];
[task setStandardInput:in];
NSData *data=[@"GB\nYorks\n\nYork\SimuplanSL\nIT\nsomeone@simuplan.com" dataUsingEncoding:NSUTF8StringEncoding];
[task launch];
[[in fileHandleForWriting] writeData:data];
[task waitUntilExit];
我只需要写入临时目录中的文件并通过输入管道提供它。