有时候我们需要在app中调用终端命令来进行处理,这样比较方便,因为Mac平台的特性,不同于iOS,Mac平台可以使用系统的工具来达到我们的各种需求,环境是不一样的。
调用终端命令
NSTask *zipTask = [[NSTask alloc] init];
[zipTask setCurrentDirectoryPath:@"/tmp"];
[zipTask setLaunchPath:@"/usr/bin/zip"];
[zipTask setArguments:[NSArray arrayWithObjects:@"-r",
zipPath,zipFolder, nil]];
[zipTask launch];
//使用waitUntilExit会一直等待,等到Task执行完毕
[zipTask waitUntilExit];
//判断执行状态
int status = zipTask.terminationStatus;
if (status == 0) {
NSLog(@"unzipTask Task succeeded.");
} else {
NSLog(@"unzipTask Task failed.");
}
在mac os 10.7之后,waitUntilExit添加了下面这种写法
NSTask *zipTask = [[NSTask alloc] init];
[zipTask setCurrentDirectoryPath:@"/tmp"];
[zipTask setLaunchPath:@"/usr/bin/zip"];
[zipTask setArguments:[NSArray arrayWithObjects:@"-r",
zipPath,zipFolder, nil]];
[zipTask launch];
zipTask.terminationHandler = ^(NSTask * _Nonnull task) {
};
有如下几点注意:
NSTask是以参数传入block中,所以不需要进行捕获
设置terminationHandler会导致收不到该任务的NSTaskDidTerminateNotification
waitUntilExit将不会等到terminationHandler完全执行完毕
这里就相当于终端输入/usr/bin/zip -r zipPath zipFolder
即压缩文件为zip格式。
这样就可以直接操作,而在iOS平台中,则需要自己集成压缩框架来实现。
获取NSTask的输出结果
NSTask *certTask = [[NSTask alloc] init];
[certTask setLaunchPath:@"/usr/bin/security"];
[certTask setArguments:[NSArray arrayWithObjects:@"find-identity", @"-v", @"-p", @"codesigning", nil]];
NSPipe *pipe = [NSPipe pipe];
[certTask setStandardOutput:pipe];
[certTask setStandardError:pipe];
NSFileHandle *handle = [pipe fileHandleForReading];
[certTask launch];
//在这之后进行获取
NSData *data;
data = [handle readDataToEndOfFile];
NSLog(@"test %@",[[NSString alloc] initWithData:data encoding:kCFStringEncodingUTF8]);
这样就可以打印出证书信息,和终端中输入/usr/bin/security find-identity -v -p codesigning
一致。