2013-03-20 86 views
3

我使用Xcode创建了命令行工具应用程序。 在该应用程序中,我使用NSWorkspace来启动另一个应用程序包(.app),如此处所示。 MacOsX: How to launch an application (.app) from a "Command Line Tool" type of appMacOsX:如果守护程序以根用户身份运行,从守护程序启动使用NSWorkspace的应用程序不起作用

所有似乎工作正常,直到我试图启动该命令行工具应用程序作为守护程序使用launchctl。 如果守护程序以当前登录的用户身份运行,那么命令行工具应用程序将启动外部应用程序。 如果守护程序以root身份运行,则命令行工具应用程序无法启动外部应用程序。 如果守护程序以root身份运行,使用NSWorkspace打开应用程序似乎不起作用。

有谁知道正确的方式来打开另一个应用程序从一个守护程序作为根运行?

回答

0

我终于通过使用此链接中提到的代码来获得“控制台用户的”uid和gid:https://superuser.com/questions/180819/how-can-you-find-out-the-currently-logged-in-user-in-the-os-x-gui。该链接显示了如何使用SCDynamicStoreCreate()和SCDynamicStoreCopyConsoleUser()获取“控制台用户”uid和gid的示例。获得uid和gid之后,只需将控制台用户的uid和gid设置为使用NSWorkspace打开一个应用程序之前,那对我来说就行了。

2

这可能是您遇到的MacOS中的安全限制。

我会建议做的是创建一个代码签名的“帮助工具”,通过setuid - 我不会在代码签名应用程序之外执行)重置为当前登录用户的用户ID ,然后执行NSWorkspace技巧在该用户上下文中启动应用程序。

创建帮助工具是不是微不足道的虽然。苹果公司的Authorization Services Programming Guide中描述了这些宏伟的概念。

看一看Apple's "SMJobBless" sample code,其中显示了如何安装助手工具,您可以设置用户权限,然后修改它的助手工具代码来启动您的应用程序。

+0

谢谢迈克尔。你能告诉我如何在代码中获取当前登录用户的用户ID吗? – ytw 2013-04-02 21:35:39

+0

检出[“'getuid()'”和“'geteuid()'”](http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man2/getuid.2。 HTML)。 – 2013-04-03 01:06:34

2

这是一个太复杂的主题,无法在StackOverflow答案中真正解决。简而言之,守护进程无法可靠地启动应用程序。对于长时间的答案,请阅读Apple的Technical Note TN2083: Daemons and Agents

+0

很好的参考。 – 2013-03-20 13:45:15

相关问题