0

我正在尝试实现一项功能来密码保护我的可可应用程序。因此,在我的 AppDelegate 中,如果在窗口上正确输入了密码,我将通过调用 NSApp runModelforWindow 方法调出主应用程序窗口。

它工作正常,除了在我允许用户更改密码的首选项中。所以这意味着为了防止用户黑客攻击,我必须隐藏主菜单,直到密码输入正确。

我不想通过使用 removeItemAtIndex 删除某些菜单项或以编程方式设置目标操作以调用该方法来调出首选项窗口。相反,我想暂时隐藏 [NSApp mainMenu]。我搜索了它,似乎找不到任何方法,比如 setHidden:YES 来隐藏它。

我试过 [[NSApp mainMenu] cancelTracking] 但它没有做这项工作

有什么简单的方法可以做到这一点吗?

4

3 回答 3

2

您可以使用-setPresentationOptions:NSApp 上的方法来隐藏和显示标准 OS UI 的许多部分,包括菜单栏和 Dock。请注意,您必须同时隐藏菜单栏和 Dock:

/* Hide */
[NSApp setPresentationOptions:[NSApp presentationOptions] |
                               NSApplicationPresentationHideMenuBar |
                               NSApplicationPresentationHideDock];

/* Show */
[NSApp setPresentationOptions:[NSApp presentationOptions] ^
                               NSApplicationPresentationHideMenuBar ^ 
                               NSApplicationPresentationHideDock];

不过,这是一种非常具有破坏性的 UI 体验。考虑在密码对话框出现在屏幕上时禁用您不希望用户访问的任何菜单项或 UI 元素。

于 2013-04-19T21:45:10.500 回答
0

不幸的是,没有简单的方法来隐藏主菜单 - 它总是显示或隐藏(取决于 info.plist 标志)。以及 Dock 图标。请参阅 LSUIElement 了解这一点。最初隐藏时显示此菜单有一个技巧,但没有在运行时隐藏/显示它的好方法。

于 2013-04-19T20:50:57.857 回答
0

如果您认真对待使用密码保护(使用)您的应用程序,隐藏菜单栏不会有太大帮助,正如您已经得出的结论。

为了防止匿名用户执行需要身份验证的操作,您实际上需要在代码中创建逻辑来保护这些操作并检查用户是否确实正确地进行了身份验证,每次他们尝试做某事(选择一个菜单项或按下一个按钮)。

话虽如此,您可以通过禁用相关菜单项来防止匿名用户打开首选项窗口。就我个人而言,我更喜欢实际禁用首选项窗口中的相关控件,以便用户可以探索不同的选项,但也了解他们需要进行身份验证。您可以遵循 Apple 用于 macOS 系统偏好设置窗口的模型,这将锁定许多(但不是全部)偏好设置窗格,具体取决于特定窗格以及用户是否进行了身份验证。

一个好的起点可能是 Apple 开发者网站上的相关文档。例如:https ://developer.apple.com/documentation/securityfoundation

如果您仍然只想隐藏菜单栏,您可以随时执行以下操作:

[NSMenu setMenuBarVisible:(BOOL)onOff];

但我相信最好使用@jatoben 的答案中的解决方案,NSApplication因为presentationOptions这可以让您真正禁用功能性。只是隐藏菜单栏[NSMenu setMenuBarVisible:(BOOL)onOff]并不会禁用 menuItems 的快捷方式,因此您仍然可以使用⌘,.

在旁注中,我相信如果您只是使用显示密码对话框,您会省去所有这些麻烦

NSModalSession session = [NSApp beginModalSessionForWindow:passwordDialog];
[NSApp runModalSession:session];

这会以模态方式显示应用程序的对话框,这意味着所有其他窗口以及几乎所有菜单项都会自动禁用……</p>

于 2019-04-16T17:28:36.243 回答