您的位置:首页 > 其它

关于NSTask使用的一些心得体会

2014-10-11 22:34 645 查看
NSTask是MAC OS X用来执行系统命令的一个类库,作用类似php的exec,最近在使用过程中遇到诸多不顺,结合以前的经验,记录一下,方便后来人

1.推荐使用Taskit

功欲善其事,必先利其器。使用现成的可能的开源类库才是王道,毕竟重复造轮子的事儿还是交给牛人去做吧,这里推荐使用Taskit。下载完以后里面有个示例工程,简单明了。

Taskit *task = [Taskit task];

task.launchPath = @"/bin/echo";

[task.arguments addObject:@"Hello World"];

task.receivedOutputString = ^void(NSString *output) {

NSLog(@"%@", output);

};

[task launch];

2.参数传递

1).参数带引号的情况(或者说有空格)

我们知道有一此命令的参数里是带空格的,这时候就需要用引号把这个参数引起来,比如一个带空格的路径的情况

[rainbird@localhost ~]$ ls "Library/Application Support/Xcode"

Color Themes/

这个时候直接[task.arguments addObject:@"Library/Application Support/Xcode"]就可以了,不用考虑空格的情况

2).参数–的情况

比如有一些命令是用–help查询帮助的,但是使用NSTask的时候,用–help死活不好使,还不报错,这个时候你会发现下面的语句就好使

[task.arguments addObject:@"-help"];

3.环境变量

有一些命令是需要环境变量支持的。比如《最近研究xcodebuild批量打包的一些心得》里提到的xcode给文件签名

xcodebuild -target targetName CODE_SIGN_IDENTITY="iPhone Distribution:XXXXXX"

CODE_SIGN_IDENTITY=”iPhone Distribution:XXXXXX” 看似一个参数,实际是个环境变量,要按环境变量来处理

[task.environment setValue:@"iPhone Distribution:XXXXXX"

forKey:@"CODE_SIGN_IDENTITY"];

4.清楚的明白你要执行的命令

这里要说的就是:不要只盯着正常输出!有些命令的所有正常输出都是输出到错误输出的,而有一命令的帮助信息都是输出到错误输出的!所以当你总是得不到output的时候,尝试获取一下errorput!

正常输出都输出到错误输出的例子:ssh,scp

帮助信息输出到错误输出的例子:xcun –help

当然了这些命令在Terminal(终端)执行的时候,都是可以正常使用的!

关于使用特权的另类用法

有的时候有一些命令是需要root权限才可以执行的。这个时候NSTask怎样获取系统权限呢?我表示我不知道!所以需要用系统权限执行的命令我就不用NSTask了,我用的Apple Script!

NSDictionary *error = [NSDictionary new];

NSString *script = @"do shell script \"/bin/ls\" with administrator privileges";

NSAppleScript *appleScript = [[NSAppleScript new] initWithSource:script];

NSAppleEventDescriptor *des = [appleScript executeAndReturnError:&error];

NSLog(@"%@",des.stringValue);



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: