我使用Xcode创建了一个命令行工具应用程序。 在该应用程序中,我使用NSWorkspace按照此处的建议启动另一个应用程序包(.app)。 MacOsX: How to launch an application (.app) from a "Command Line Tool" type of app
在我尝试使用launchctl将该命令行工具应用程序作为守护程序启动之前,似乎一切正常。 如果守护程序作为当前登录用户运行,那么命令行工具应用程序就可以正常启动外部应用程序。 如果守护程序以root身份运行,则命令行工具应用程序无法启动外部应用程序。 如果守护程序以root身份运行,则使用NSWorkspace打开应用程序似乎不起作用。
有没有人知道从以root身份运行的守护程序中打开另一个应用程序的正确方法?
答案 0 :(得分:2)
这可能是您遇到的MacOS中的安全限制。
我建议做的是创建一个代码签名的“帮助工具”,将自身(通过setuid - 我不会在代码签名的应用程序之外执行)重置为当前登录用户的用户ID,然后执行NSWorkspace技巧以在该用户上下文中启动应用程序。
创建帮助工具并非简单。 Apple的Authorization Services Programming Guide描述了宏观概念。
查看Apple's "SMJobBless" sample code,其中显示了如何安装可以设置用户权限的帮助工具,然后修改它的帮助工具代码以启动您的应用。
答案 1 :(得分:2)
这是一个太复杂的主题,无法在StackOverflow答案中真正解决。简短的回答是守护进程无法可靠地启动应用程序。如需长篇答案,请阅读Apple的Technical Note TN2083: Daemons and Agents。
答案 2 :(得分: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打开应用程序,这对我来说就是诀窍。