Mac OS X下从服务进程中启动另一个应用程序(Cocoa Application)

最近因为工作的原因,开始转向Mac OS X下的应用程序开发,基于最新的Mac OS X 10.12以及Xcode8.1。有一个功能是需要在当前的服务进程(Command line tools工程)中调起一个界面程序(Cocoa Application)并显示在顶层界面,在实现这个功能的过程中,遇到了不少坑,感觉都挺有价值的,加上目前网上关于Mac OS X应用编程这块的资料挺少的,所以在此记录下来,供其他猿友参考。

首先,新建两个macOS下的工程,一个Cocoa Application工程,名为TestCocoa;一个Command Line Tool工程,名为TestCmd。(注:开发工具为Xcode8.1)

接着在TestCmd中添加启动TestCocoa的代码,此处只贴关键代码。我采用的是NSTask这个类对象来实现,实现的函数代码如下:

- (void) launchAppliction: (NSString*) appPath
{
    //appPath指向可执行文件的绝对地址
    NSTask *softTask = [[NSTask alloc]init];
    [softTask setLaunchPath:appPath];
    [softTask setArguments:[NSArray arrayWithObjects:@"hello world", "2016", nil]];//设置运行参数
    [softTask launch];
}
    


此处有一个小坑,就是指定TestCocoa的执行文件路径,我们都知道,Cocoa Application编译后生成了一个****.app的文件(实际上是一个包),在OS X系统中双击这个文件是可以直接运行程序的。当我在TestCmd中使用TestCocoa.app对应的路径去启动程序的时候,我会发现程序是启动不起来的。正确的执行文件路径应该是....../TestCocoa.app/Contents/MacOS/TestCocoa

 

指定好正确的执行文件路径,运行TestCmd,发现TestCocoa有被调起来,但是却没有直接显示在顶层界面,如下图所示:


- (void) launchAppliction: (NSString*) appPath{ //appPath指向可执行文件的绝对地址 NSTask *softTask = [[NSTask alloc]init]; [softTask setLaunchPath:appPath]; [softTask setArguments:[NSArray arrayWithObjects:@"hello world", "2016", nil]]; [softTask launch];}


期望的效果应该如下图:

于是乎...进入了漫长的求索之路,发现百度上关于Mac OS X编程这块的资料真是少,无奈翻墙使用google,搜索关键字也干脆改成了英文,最终在一则英文博客上找到了答案。就是在TestCocoa工程中如下图所示的位置添加一行代码:

界面运行在顶层的问题解决了,最后就是传参了。在前面的启动函数中,我通过NSTask对象设置了运行参数,那么在TestCocoa中,又怎么获取这些运行参数呢?
首先看TestCocoa中的main函数,定义如下:

int main(int argc, const char * argv[])
{
    return NSApplicationMain(argc, argv);
}

可以看到main函数是有接收运行参数的,所以在main函数中是能正常获取到运行参数的,但是如何在程序的其他地方获取到运行参数呢?可以看到main函数的最后执行了ruturn NSApplictionMain(argc, argv); 代码, NSApplicationMain函数是系统函数,我暂时还没弄清楚它接收到运行参数后具体做了什么处理。难道要在main函数中自行获取运行参数并保存起来吗?如果真这样做那未免也太麻烦了。还好,objective-c为我们提供了NSProcessInfo这个类对象,通过这个类对象,我们得到进程的相关信息,当然包括了运行参数:

NSArray *arguments = [[NSProcessInfo processInfo] arguments];

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值