在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
- 1. 如何从node.js应用程序运行命令行工具
- 2. 带命令行应用程序的MacOSX C++工作目录
- 3. 如何运行弹簧启动应用程序作为Web应用程序以及命令行应用程序?
- 4. 使用命令启动应用程序
- 5. 如何使用Java的Crossover启动命令行应用程序?
- 6. 从Swift应用程序启动App Store
- 7. 从命令行运行应用程序并启动浏览器
- 8. Mac OS X:如何静默启动一个“命令行工具”类型的应用程序
- 9. 如何通过命令行触发应用程序启动?
- 10. 从命令行工具到可可应用程序
- 11. 从命令行重新启动com +应用程序
- 12. 从命令行启动erlang应用程序
- 13. 应用程序启动时应用程序类不运行?
- 14. 如何从其他应用程序启动ClickOnce应用程序?
- 15. 如何从Java Web应用程序启动Android应用程序?
- 16. 如何从C#应用程序启动应用程序?
- 17. 如何通过命令行将应用程序作为守护程序启动?
- 18. 从应用程序启动“启动器应用程序抽屉”?
- 19. 如何以编程方式从命令行启动命令行版本的应用程序?
- 20. 使用命令行参数启动应用程序
- 21. 使用命令行在OS X上启动应用程序
- 22. 黑莓:命令行构建和应用程序自动启动
- 23. Mac OS应用程序,带命令行工具的沙箱?
- 24. 春季启动应用程序时,挂在命令行运行
- 25. Eclipse RCP:无需启动应用程序的命令行参数
- 26. 如何在Mac应用程序中使用AppleScript运行命令行工具
- 27. 如何重新启动C++命令提示符应用程序?
- 28. 如何从命令行重新启动Rails应用程序时定义环境?
- 29. 如何从Cocoa-Applescript应用程序启动命令行二进制文件?
- 30. android:如何从命令行控制启动/结束应用程序
可以使用'系统(为const char *命令)'(包括在stdlib.h)并运行“open /path/to/application.app” – 2013-03-18 18:42:36
不使用系统,NSGod的答案看起来不错 – 2013-03-18 20:27:02