2013-03-18 80 views
1

在Xcode 4.6中,我创建了一个基于“命令行工具”项目模板的新应用程序。 如何以编程方式从该“命令行工具”应用程序启动另一个应用程序(.app应用程序包)?MacOsX:如何从“命令行工具”类型的应用程序启动应用程序(.app)

+0

可以使用'系统(为const char *命令)'(包括在stdlib.h)并运行“open /path/to/application.app” – 2013-03-18 18:42:36

+0

不使用系统,NSGod的答案看起来不错 – 2013-03-18 20:27:02

回答

3

有很多方法可以实现这一点,使用启动服务和或NSWorkspace

标识捆绑应用程序的更灵活方法之一是通过其捆绑标识符(CFBundleIdentifier),这是一个像com.apple.TextEdit这样的字符串。这使您可以识别应用程序,而不必硬编码找到应用程序的假定路径,或者通过对应用程序包的名称进行硬编码(两者都可以轻松更改)。您可以使用NSWorkspacelaunchAppWithBundleIdentifier:options:additionalEventParamDescriptor:launchIdentifier:来启动应用程序。如果您还不知道它,可以通过检查其AppName.app/Contents/Info.plist文件来获取应用程序包的包标识符。然后使用下面的代码:

if (![[NSWorkspace sharedWorkspace] 
     launchAppWithBundleIdentifier:@"com.apple.TextEdit" 
          options:NSWorkspaceLaunchDefault 
     additionalEventParamDescriptor:NULL 
        launchIdentifier:NULL]) { 
     NSLog(@"launching app failed!); 
} 

重要:NSWorkspaceAppKit.framework框架,它最初没有包含在“命令行工具”项目模板的一部分。要将其添加到您的项目中,请选择目标列表中的目标,如下图所示,然后单击+按钮添加其他框架。

enter image description here

添加两个AppKit.frameworkCocoa.framework

这将导致所有3列在链接二进制库存步骤。在这一点上,你可以删除这两个从连接阶段Foundation.frameworkAppKit.framework,并且只留下Cocoa.framework,象下面这样:

enter image description here

+0

要使用这种语法([[NSWorkspace sharedWorkspace]),创建新的“命令行工具”项目时应该为Type选项(C/C++/Core Data/Core Foundation/Core Services/Foundation)选择什么? – ytw 2013-03-18 20:56:18

+1

@ytw:您可以使用'Foundation'模板,但您需要添加我提到的其他框架。你使用过什么样的模板(我刚刚假设'基金会',对此感到抱歉)。如果您对Objective-C感到不舒服,请告诉我,我可以添加代码以使用Launch Services(这是基于C的,并且是CoreServices框架的一部分)。 – NSGod 2013-03-18 21:59:28

+0

谢谢,NSGod。您提供的代码大部分时间都正常工作。有一种情况似乎不起作用,那就是命令行应用程序是以root身份启动的。我看到“启动应用程序失败!”在日志文件中。任何想法可能会造成这种情况?谢谢。 – ytw 2013-03-19 23:19:55

0

你试过“开放”吗?至少在终端“打开”运行文件和/或应用程序。

+0

“Open”在终端中工作,但我如何从代码调用open? – ytw 2013-03-18 18:43:59

相关问题