Mac开发-代码中调用终端命令行NSTask

本文介绍了在Mac应用中如何通过NSTask调用终端命令,例如进行文件压缩和证书信息查询。示例代码展示了如何设置当前目录、启动路径、参数,并设置terminationHandler。同时,注意到waitUntilExit的使用细节及其与terminationHandler的关系。通过这种方式,开发者可以在Mac环境中便捷地利用系统工具执行任务,而在iOS平台上则通常需要集成专门的框架。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有时候我们需要在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
一致。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值