我正在开发一款Mac应用程序,它可以选择安装一些苹果包格式的额外软件。这个软件包需要提升(root)权限才能安装,而不是使用帮助工具或AuthorizationExecuteWithPrivileges()
,我觉得使用NSTask更容易调用/usr/bin/open
甚至/System/Library/CoreServices/Installer.app/Contents/MacOS/Installer
包的路径,让它处理用户授权。
因此,它可以正常工作,但是安装程序窗口不会出现在堆栈的前面,也不会出现密钥。在启动任务之前,我可以orderOut
调用窗口,这有助于排序,但关键是,确实是关键。
我应该继续实施Apple的BetterAuthorizationSample
,因为我可能不得不在将来的某个时候使用它,并且因为它会成为一个更好的人尝试过吗?
答案 0 :(得分:2)
有两个变量决定了哪个窗口是关键。其中之一是应用程序中的一个设置,用于确定哪个窗口处于焦点,另一个是哪个应用程序处于活动状态。在我们自己的应用程序中隐藏窗口将使安装程序可见,但除非您使安装程序应用程序处于活动状态,否则它不会成为密钥。你有几个选择。
首先,您可以使用以下命令停用您的应用程序:
[[NSApplication sharedApplication] deactivate];
接下来,您可以找到安装程序的NSRunningApplication
并将其激活:
NSArray *apps = [[NSWorkspace sharedWorkspace] runningApplications];
NSRunningApplication *app = // find installer
[app activateWithOptions:0];
但在您的情况下,我建议您使用NSWorkspace
为您打开安装程序,而不是通过NSTask
启动它。 NSWorkspace
将自动停用您的应用程序,因此您无需获得有关文件是否成功打开的反馈,并自动选择打开它的应用程序。
BOOL success = [[NSWorkspace sharedWorkspace] openFile:@"path/to/file.pkg"];
答案 1 :(得分:0)
您可以通过在applicationDidFinishLaunching处理程序中包含以下代码来强制将进程置于前面的代码中:
ProcessSerialNumber process;
GetCurrentProcess(&process);
SetFrontProcess(&process);
这将使它成为最重要的过程,无论其他什么。但是,您需要链接到Carbon。