这不回答你的问题,但它是很好的了解一个新的API调用,出现在10.9和可以显示授权屏幕或绕过它:
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
或使用Objective C:
NSString *urlString = @"x-apple.systempreferences:com.apple.preference.security?Privacy_Accessibility";
[[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:urlString]];
这可以用第一代码片段进行配对,以测试是否accessibilityEnabled
通过传递到@NO
kAXTrustedCheckOptionPrompt
同时防止系统弹出出现,而不是打开辅助工具首直接窗格:
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]];
}
没有,有没有办法规避需要访问这个屏幕。它是操作系统的基本保护之一。任何可以避免这种情况的方式几乎肯定会被修补。 – ChrisCM
@ChrisCM提示用户为应用程序启用辅助功能并重新启动应用程序是不可接受的解决方案。 – Vinpai
我相信这是非常有意的行为,无法绕开。当你有权访问辅助功能时,你可以从文本框中复制文本,随机点击一些东西,一般来说做一些非常简单的事情。虽然这些东西在某些应用程序中非常有用,但它们不希望在用户不知情的情况下发生。但是,这显然是他们的沙盒努力使副作用更加“安全”的一个副作用。 –