如何在macOS应用程序中(从AppDelegate)提示辅助功能特性?

4

我正在构建一款需要监控全局按键的 macOS 应用程序。所以全局事件监听器将是:

NSEvent.addGlobalMonitorForEvents(matching: NSEvent.EventTypeMask.keyDown) { (event) in
          print(event.keyCode)
}

但是,就像在这个帖子中提到的那样,这并没有产生任何效果。我尝试了帖子中给出的答案,通过添加以下代码:

let options: NSDictionary = [kAXTrustedCheckOptionPrompt.takeUnretainedValue() as String : true]
let accessEnabled = AXIsProcessTrustedWithOptions(options)
      

if !accessEnabled {
   print("Access Not Enabled")
} else {
   print("Access Granted")
}

这会弹出一个对话框来请求访问权限,但由于这是异步过程,授权还没有将线程移动到可以监视按键的点。此外,该对话框在每次启动应用程序时都会弹出,如何优雅地请求辅助功能而不带麻烦,因为就我所搜到的,没有适当的文档。


你在隐私设置中启用了应用程序的辅助功能吗?一旦允许,它将不再提示。 - RTXGamer
我已经在设置中允许了它。但是无论如何它仍然提示,我去检查发现我已经给予了它权限。每次构建和运行时都会弹出提示。 - Sabesh Bharathi
1
我正在使用macOS Monterey 12.2,第一次启动时提示访问权限,我启用了辅助功能。第二次启动不会提示访问权限,按键被捕获。我是直接通过Xcode运行源代码的。 - RTXGamer
1
@RTXGamer 谢谢您提供这个信息。事实证明,这是一个 macOS 的 Bug(请查看答案)。 - Sabesh Bharathi
1个回答

2
我发现这是一个Xcode的错误。如果SwiftUI预览提供程序与实际构建同时运行,就会导致某些混淆,特别是在macOS的辅助功能权限方面。
清理派生数据目录后,应用程序将按预期工作。您可以使用以下命令进行清理:
rm -rf ~/Library/Developer/Xcode/DerivedData

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接