我正在开发一款 Mac 应用程序,该应用程序可以选择提供安装一些 Apple 软件包格式的额外软件的功能。此软件包需要提升的(root)权限才能安装,而不是使用帮助工具或 AuthorizationExecuteWithPrivileges()
,我想使用 NSTask 来调用 /usr/bin/open
会更容易甚至/System/Library/CoreServices/Installer.app/Contents/MacOS/Installer
与包的路径并让它处理用户授权。
所以,它工作得很好,但安装程序窗口不会出现在堆栈的前面,也不是关键。我可以orderOut
启动任务之前的调用窗口,这有助于排序,但关键实际上是使其成为关键。
我应该继续实现 Apple 的 BetterAuthorizationSample
因为我可能在将来的某个时候必须使用它,并且因为尝试过它会让我成为一个更好的人?
最佳答案
有两个变量决定哪个窗口是关键。其中之一是应用程序内的设置,用于确定哪个窗口处于焦点状态,另一个是哪个应用程序处于事件状态。在我们自己的应用程序中隐藏窗口将使安装程序可见,但除非您激活安装程序应用程序,否则它不会成为关键。您有几种选择来执行此操作。
首先,您可以使用以下方法停用您的应用程序:
[[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"];
关于objective-c - 是否可以设置 NSTask 拥有的窗口前面和按键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9026500/