我想在10.9上以编程方式启用辅助设备的访问.在10.8及更低版本中,我使用以下Applescript来启用辅助设备的访问:

tell application "System Events"
if UI elements enabled is false then
    set UI elements enabled to true
end if
end tell

在10.9版本中,苹果将可访问性选项转移到了系统偏好上➞ 保安及;隐私➞ 隐私➞ 可访问性.与之前版本的OS X不同,OS X对所有应用程序都使用了通用复选框,10.9中的新功能允许用户单独 Select 哪些应用程序可以控制系统,以执行其各种脚本功能.

关于可访问性的新系统首选项

苹果尚未向开发者提供任何API,以编程方式实现应用程序的可访问性.因此,当应用程序使用可访问性API时,Mac OS 10.9将提示一个对话框,请求最终用户允许启用可访问性.此外,用户必须在启用可访问性后重新启动应用程序.

10.9 OS为Xcode设置的默认提示对话框

我们能否使用Applescript或任何其他API在10.9上以编程方式访问辅助设备?如果您能帮助解决这个问题,我们将不胜感激.

推荐答案

这并不能回答您的问题,但最好了解10.9中出现的一个新API调用,它允许您显示授权屏幕或绕过它:

NSDictionary *options = @{(id)kAXTrustedCheckOptionPrompt: @YES};
BOOL accessibilityEnabled = AXIsProcessTrustedWithOptions((CFDictionaryRef)options);

超过YES将强制出现授权屏幕,超过NO将自动跳过.返回值与AXAPIEnabled()返回的值相同,后者在10.9中被弃用.要确保该功能在您的系统上可用,只需将其与NULL进行比较:

if (AXIsProcessTrustedWithOptions != NULL) {
    // 10.9 and later
} else {
    // 10.8 and older
}

您需要向项目中添加ApplicationServices.framework,然后导入到项目中.m或.h文件:

#import <ApplicationServices/ApplicationServices.h>

很遗憾,授权屏幕不允许用户直接授权应用程序,它只打开了系统首选项的正确部分.顺便说一句,你不需要通过无用的系统对话就可以直接完成:

tell application "System Preferences"
    set securityPane to pane id "com.apple.preference.security"
    tell securityPane to reveal anchor "Privacy_Accessibility"
    activate
end tell

或者使用目标C:

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

这可以与第一个代码段配对,通过传递@NOkAXTrustedCheckOptionPrompt来测试是否为accessibilityEnabled,同时防止出现系统弹出窗口,而是直接打开可访问性首选项窗格:

NSDictionary *options = @{(id)kAXTrustedCheckOptionPrompt: @NO};
BOOL accessibilityEnabled = AXIsProcessTrustedWithOptions((CFDictionaryRef)options);
if (!accessibilityEnabled) {
    NSString *urlString = @"x-apple.systempreferences:com.apple.preference.security?Privacy_Accessibility";
    [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:urlString]];
}

Objective-c相关问答推荐

如何删除Objective-C中未定义的符号&错误?

在哪里可以找到 iPad 示例代码

如何使用 NSFileManager 删除目录及其内容

将 CFDictionaryRef 转换为 NSDictionary?

带有语法高亮的 UITextView

MKMapView MKPointAnnotation 点击​​事件

iOS 内存分配 - 一个应用程序可以使用多少内存?

如何为图层 shadowOpacity 设置动画?

我可以设置 `UILabel` 的 `attributedText` 属性吗

UIFont 的磅值到底是多少?

AVAssetImageGenerator 提供旋转的图像

选中时选中的 UItableViewCell 保持蓝色

协议和代表之间的区别?

如何本地化 iOS 故事板

Objective-c 2.0 中的可选参数?

捕捉固定步数的 UISlider(如 iOS 7 设置应用程序中的文本大小)

将 NSDate 舍入到最接近的 5 分钟

带有Go按钮而不是返回的 iOS 键盘

围绕其中心旋转 UIView 保持其大小

如何使用图像和标签制作自定义 UIBarButtonItem?