我在Mac编程方面很新颖。我正在向OSX移植一个插件。我需要我的应用程序启动第二个应用程序(我不控制源代码),然后获取退出代码。 NSWorkspace launchApplicationAtURL非常适合用所需的参数启动它,但我无法看到如何获取退出代码。在设置终止第二个应用程序的通知后有没有办法获得它?我看到了使用NSTask代替退出代码的工具。我应该使用它吗?使用NSWorkspace启动应用程序后退出状态launchApplicationAtURL
3
A
回答
6
NSWorkspace
方法真的是启动独立的应用程序;按照文档,使用NSTask
“将另一个程序作为子进程运行并......监视程序的执行”。
这里是启动一个可执行文件,并返回其标准输出的简单方法 - 它会阻止等待完成:
// Arguments:
// atPath: full pathname of executable
// arguments: array of arguments to pass, or nil if none
// Return:
// the standard output, or nil if any error
+ (NSString *) runCommand:(NSString *)atPath withArguments:(NSArray *)arguments
{
NSTask *task = [NSTask new];
NSPipe *pipe = [NSPipe new];
[task setStandardOutput:pipe]; // pipe standard output
[task setLaunchPath:atPath]; // set path
if(arguments != nil)
[task setArguments:arguments]; // set arguments
[task launch]; // execute
NSData *data = [[pipe fileHandleForReading] readDataToEndOfFile]; // read standard output
[task waitUntilExit]; // wait for completion
if ([task terminationStatus] != 0) // check termination status
return nil;
if (data == nil)
return nil;
return [NSString stringWithUTF8Data:data]; // return stdout as string
}
你可能不希望阻止,尤其是如果这是你的主UI线程,供应标准输入等
1
事实上,NSTask的这个属性应该做的伎俩:terminationStatus
从苹果的doc:
返回接收器的可执行文件返回的退出状态。
- (INT)terminationStatus
我测试,它工作正常。注意测试任务是否先运行,否则将启动异常。
if (![aTask isRunning]) {
int status = [aTask terminationStatus];
if (status == ATASK_SUCCESS_VALUE)
NSLog(@"Task succeeded.");
else
NSLog(@"Task failed.");
}
希望它能帮助。
相关问题
- 1. 使用NSWorkspace获取已启动应用程序的进程ID
- 2. 观察osx应用程序的状态(开启,退出)
- 3. 从用户已经退出的相同状态启动应用程序
- 4. 退出后保留iPhone应用程序的状态
- 5. 退出应用程序后保存ImageView状态(onSaveInstanceState)
- 6. 在应用程序之后重新启动IIS托管应用程序。退出
- 7. 程序退出状态
- 8. 退出程序的状态
- 9. NSWorkspace launchApplicationAtURL不NSWorkspaceLaunchConfigurationArguments工作从终端
- 10. 应用程序退出命令后立即重新启动
- 11. 启动多个winforms后退出应用程序的方法?
- 12. 退出应用程序后退按键
- 13. WP7 PhoneGap应用程序后退按钮退出应用程序
- 14. System.exit(0),使活动迅速退出时,应用程序启动
- 15. 哪些应用程序启动到后台状态?
- 16. Swing程序启动后立即退出
- 17. Facebook连接iOS版自动退出应用程序后退出
- 18. 启动外部应用程序和模块当前应用程序,直至启动的应用程序退出
- 19. 苹果脚本重新启动并重新启动后退出应用程序
- 20. 如何在应用程序退出时保存应用程序状态
- 21. 启动后弹出启动应用程序立即启动
- 22. 如何在用户点击退出后重置iOS应用程序状态?
- 23. 程序退出后,TcpListener Socket仍然处于活动状态
- 24. 在启动应用程序时调用ContentProvider时 - 如何退出应用程序
- 25. Android应用程序状态从启动状态恢复 - 恢复状态
- 26. 使用NSWorkspace启动应用程序而不激活它或切换空间
- 27. 应用程序重启状态管理
- 28. 防止退出程序启动后Emacs退出?
- 29. 未启动应用程序后的模态视图不出现
- 30. 退出应用程序时保存按钮的新状态
非常感谢!我有一个更加基本的NSTask版本,但这非常有用。我的困惑是NSTask vs NSWorkspace的相对目的。不知何故,我得到了NSWorkspace取代NSTask的印象。 – Ben 2011-03-15 15:11:07
谢谢,最后一行我改回 [[[的NSString页头] initWithData:数据编码:NSUTF8StringEncoding]自动释放] 因为应用程序崩溃 – 2017-11-16 14:24:44