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

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);

    分享到:

About rainbird

IOS攻城狮
This entry was posted in Mac开发, object-c and tagged , , , , , , , , , . Bookmark the permalink.

发表评论