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

时间:2017-04-18 10:31:21

标签: objective-c macos accessibility

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

解决方案1 ​​

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

解决方案2

NSString* urlString = @"x-apple.systempreferences:com.apple.preference.security?Privacy_Accessibility";
[[NSWorkspace sharedWorkspace] openURL: [NSURL URLWithString:urlString]];

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

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

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

1 个答案:

答案 0 :(得分:3)

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

但是有一种方法可以使用第一种解决方案而不会在对话框中提示用户再次点击。

解决方案3(第1次分拆):

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

以某种方式这样做不会导致弹出对话框;然而它触发了神奇的AXIsProcessTrustedWithOptions,这使得应用程序出现在辅助功能窗格中。

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

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