Mac OS X 下用NSTask 创建进程显示程序路径无法访问的问题。

妙笔花生 2018-09-14 08:49:50
我在做openvpn的相关工作,现在要测试openvpn的打开功能。我在控制台程序中写了一段代码,如下:
int iRet = 0;
NSString * pPath = @"/Users/linhsmac/Proj/WdSpeedProj/build/Debug/openvpn";
NSArray * args =@[@"--log",
@"/Users/linhsmac/Proj/WdSpeedProj/build/Debug/opnvpn.log",
@"--config",
@"/Users/linhsmac/Proj/WdSpeedProj/build/Debug/client.ovpn",
@"--setenv",
@"IV_GUI_VER \"OpenVPN GUI 11\"",
@"--management",
@"127.0.0.1",
@"25340"
] ;
NSTask *task;
task = [[NSTask alloc] init];
[task setLaunchPath: pPath];

NSArray *argHelp;
argHelp = [NSArray arrayWithObjects: @"--help", nil];
//[task setArguments: argHelp];
[task setArguments: args];
NSPipe *pipe;
pipe = [NSPipe pipe];
NSPipe * inputPipe = [NSPipe pipe];
[task setStandardOutput: pipe];
[task setStandardInput:inputPipe];
NSFileHandle *file;
file = [pipe fileHandleForReading];
NSFileHandle * InFile = [inputPipe fileHandleForWriting];
NSString * pDir = @"/Users/linhsmac/Proj/WdSpeedProj/build/Debug";
[task setCurrentDirectoryPath:pDir];
[task launch];
const char *str = "\n";
NSData *data2 = [NSData dataWithBytes: str length:strlen(str)];
//[InFile writeData:data2];
NSData *data;
data = [file readDataToEndOfFile];

NSString *string;
string = [[NSString alloc] initWithData: data
encoding: NSUTF8StringEncoding];
NSLog (@"got\n%@", string);


然后一切顺利,也连上了openvpn的服务器。
然后我把这段代码迁移到有界面的程序中,并在applicationDidFinishLaunching中运行这段相同的代码,但是却遇到了问题。主要表现在:
1、调试的指针运行到[task launch];后就不会再跳出
2、 在调试的输出窗口中显示了很多错:
018-09-14 20:19:34.179800+0800 WdSpeedProj[7241:139122] [General] launch path not accessible
2018-09-14 20:19:34.181702+0800 WdSpeedProj[7241:139122] [General] (
0 CoreFoundation 0x00007fff3738132b __exceptionPreprocess + 171
1 libobjc.A.dylib 0x00007fff5e9ebc76 objc_exception_throw + 48
2 CoreFoundation 0x00007fff37412dcd +[NSException raise:format:] + 205
3 Foundation 0x00007fff395d5992 -[NSConcreteTask launchWithDictionary:error:] + 1304
4 WdSpeedProj 0x00000001000023e4 RunNSTask + 612
5 WdSpeedProj 0x0000000100002a26 RunOpenvpn + 710
6 WdSpeedProj 0x0000000100000f0e -[ViewController slConnectBtnClked:] + 46
7 AppKit 0x00007fff3502ea43 -[NSApplication(NSResponder) sendAction:to:from:] + 312
8 AppKit 0x00007fff34ad453f -[NSControl sendAction:to:] + 86
9 AppKit 0x00007fff34ad4467 __26-[NSCell _sendActionFrom:]_block_invoke + 136
10 AppKit 0x00007fff34ad436d -[NSCell _sendActionFrom:] + 183
11 AppKit 0x00007fff34b15688 -[NSButtonCell _sendActionFrom:] + 97
12 AppKit 0x00007fff34ad2bd6 -[NSCell trackMouse:inRect:ofView:untilMouseUp:] + 2438
13 AppKit 0x00007fff34b153cf -[NSButtonCell trackMouse:inRect:ofView:untilMouseUp:] + 777
14 AppKit 0x00007fff34ad1670 -[NSControl mouseDown:] + 965
15 AppKit 0x00007fff351cdd6d -[NSWindow(NSEventRouting) _handleMouseDownEvent:isDelayedEvent:] + 5891
16 AppKit 0x00007fff351ca9c4 -[NSWindow(NSEventRouting) _reallySendEvent:isDelayedEvent:] + 2359
17 AppKit 0x00007fff351c9c70 -[NSWindow(NSEventRouting) sendEvent:] + 497
18 AppKit 0x00007fff3502b236 -[NSApplication(NSEvent) sendEvent:] + 2462
19 AppKit 0x00007fff3488b8b5 -[NSApplication run] + 812
20 AppKit 0x00007fff3485aa72 NSApplicationMain + 804
21 WdSpeedProj 0x00000001000010e2 main + 34
22 libdyld.dylib 0x00007fff5f605015 start + 1
)


最核心的错误我认为是 launch path not accessible。也就是有界面的程序运行时,无法访问到时openpvn路径,但这个路径是肯定存在于电脑中的。

这样要怎么解决?

我的想法是这应该是缺少权限造成的。我的想法是否正确?还请各位大神不吝赐教,或者有其他的解决方法。
...全文
652 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
a308253767 2018-09-19
  • 打赏
  • 举报
回复
主要解决两个点:
第一,要给openvpn程序添加权限,很简单,在终端通过chmod 777 openvpn 命令,给openvpn提权。
第二,要将openvpn放到正确的目录下。这个正确的目录就是在程序包中。比如说,找到你的输出目录中的程序包,右键选择显示包内容,进入到contents/resources,将openvpn放到这个目录下,然后命令行中的路径 也改到这个目录下。
如果还有不懂的,也可以参考 https://www.raywenderlich.com/1197-nstask-tutorial-for-os-x ,这是外国网站的资料。英文不好的,用谷歌翻译下就行了。
妙笔花生 2018-09-17
  • 打赏
  • 举报
回复
这么难吗。有哪位大神能帮我看看呀。

29,027

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧