这并不能回答您的问题,但最好了解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]];
这可以与第一个代码段配对,通过传递@NO
到kAXTrustedCheckOptionPrompt
来测试是否为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]];
}