用于更改可访问性的 AXIsProcessTrustedWithOptions 和 NSWorkspace openURL 之间的区别

Jer*_*rry 3 macos accessibility objective-c

为了能够使用某些功能,用户需要在辅助功能面板中启用应用程序。有两种方法可以调出如下图所示的页面

解决方案1

NSDictionary* options = @{static_cast<id> (kAXTrustedCheckOptionPrompt): @YES};
return AXIsProcessTrustedWithOptions(static_cast<CFDictionaryRef> (options));
Run Code Online (Sandbox Code Playgroud)

解决方案2

NSString* urlString = @"x-apple.systempreferences:com.apple.preference.security?Privacy_Accessibility";
[[NSWorkspace sharedWorkspace] openURL: [NSURL URLWithString:urlString]];
Run Code Online (Sandbox Code Playgroud)

与解决方案 1 相比,解决方案 2 不需要引入额外单击的解释对话框。这是我更喜欢使用解决方案 2 的主要原因。

但是我发现有时使用解决方案 2 的系统无法识别我启用的应用程序。 因为有时即使在辅助功能面板中启用了该应用程序,当我启动会产生另一个子进程的包时,标准错误会输出类似“辅助设备不信任这个过程”。

解决方案 1 是否有一些隐藏的技巧而解决方案 2 没有?

kar*_*zak 5

直接回答这个问题:我不知道有什么区别,但我也注意到AXIsProcessTrustedWithOptions从第一个解决方案调用会以某种方式使我的应用程序出现在辅助功能窗格中,而第二个解决方案则没有。魔法?也许。

但是有一种方法可以在没有对话框提示用户再次单击的情况下使用第一个解决方案。

解决方案 3(第 1 个的衍生):

NSDictionary* options = @{static_cast<id> (kAXTrustedCheckOptionPrompt): @NO};
return !AXIsProcessTrustedWithOptions(static_cast<CFDictionaryRef> (options));
Run Code Online (Sandbox Code Playgroud)

不知何故,这样做不会导致弹出对话框;但它会触发神奇的AXIsProcessTrustedWithOptions,使应用程序出现在辅助功能窗格中。

然后,您可以使用返回的值来确定是否需要为用户打开窗格、显示一些自定义对话框或其他任何您想要的内容。

来源和更多信息:https : //stackoverflow.com/a/18121292/8538394