MacOsX:如何从“命令行工具”类型的应用程序启动应用程序(.app)
在Xcode 4.6中,我创建了一个基于“命令行工具”项目模板的新应用程序。 如何以编程方式从该“命令行工具”应用程序启动另一个应用程序(.app应用程序包)?MacOsX:如何从“命令行工具”类型的应用程序启动应用程序(.app)
有很多方法可以实现这一点,使用启动服务和或NSWorkspace
。
标识捆绑应用程序的更灵活方法之一是通过其捆绑标识符(CFBundleIdentifier
),这是一个像com.apple.TextEdit
这样的字符串。这使您可以识别应用程序,而不必硬编码找到应用程序的假定路径,或者通过对应用程序包的名称进行硬编码(两者都可以轻松更改)。您可以使用NSWorkspace
的launchAppWithBundleIdentifier: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!);
}
重要:NSWorkspace
是AppKit.framework
框架,它最初没有包含在“命令行工具”项目模板的一部分。要将其添加到您的项目中,请选择目标列表中的目标,如下图所示,然后单击+按钮添加其他框架。
添加两个AppKit.framework
和Cocoa.framework
。
这将导致所有3列在链接二进制库存步骤。在这一点上,你可以删除这两个从连接阶段Foundation.framework
和AppKit.framework
,并且只留下Cocoa.framework
,象下面这样:
要使用这种语法([[NSWorkspace sharedWorkspace]),创建新的“命令行工具”项目时应该为Type选项(C/C++/Core Data/Core Foundation/Core Services/Foundation)选择什么? – ytw 2013-03-18 20:56:18
@ytw:您可以使用'Foundation'模板,但您需要添加我提到的其他框架。你使用过什么样的模板(我刚刚假设'基金会',对此感到抱歉)。如果您对Objective-C感到不舒服,请告诉我,我可以添加代码以使用Launch Services(这是基于C的,并且是CoreServices框架的一部分)。 – NSGod 2013-03-18 21:59:28
谢谢,NSGod。您提供的代码大部分时间都正常工作。有一种情况似乎不起作用,那就是命令行应用程序是以root身份启动的。我看到“启动应用程序失败!”在日志文件中。任何想法可能会造成这种情况?谢谢。 – ytw 2013-03-19 23:19:55
可以使用'系统(为const char *命令)'(包括在stdlib.h)并运行“open /path/to/application.app” – 2013-03-18 18:42:36
不使用系统,NSGod的答案看起来不错 – 2013-03-18 20:27:02