带有 AXTextMarker 的 WebKit 应用程序上的 macOS 可访问性 API

macOS accessibility API on WebKit applications with AXTextMarker

我需要从 Safari、Mail 等 webkit 应用程序访问数据。我可以在 Accessibility Inspector 中看到 :AXTextMarkerAXTextMarkerForRange.

我尝试了通常的方法来获取此信息:

AXUIElementRef systemWideElement = AXUIElementCreateSystemWide();    //creating system wide element
AXUIElementRef focussedElement = NULL;

AXError error = AXUIElementCopyAttributeValue(systemWideElement, kAXFocusedUIElementAttribute, (CFTypeRef *)&focussedElement);                //Copy the focused
if (error != kAXErrorSuccess){
    NSLog(@"Could not get focused element");
}else{
    AXValueRef marker = NULL;
    AXError getTextValueError = AXUIElementCopyAttributeValue(focussedElement, kAXMarkerUIElementsAttribute , (CFTypeRef *)&marker);        
}

kAXMarkerUIElementsAttribute 是我用 Marker 唯一能看到的东西,但每次都是空的。

我想出于安全原因,我无法访问它们?有什么办法吗。我正在为阅读有困难的人开发一个应用程序,它真的很有帮助。

谢谢

试试这个,我还没有测试过这个,但我发现了一些关于 API 的研究,我认为这可能会解决你的问题。

似乎要使可访问性 API 完全正常工作,应用程序需要受信任或基本上具有 root 访问权限。应用程序 运行ning 是否在 root 中?

我从过去的项目中找到了一些苹果脚本。似乎相关

NSDictionary *errorInfo = [NSDictionary new];
NSString *script =  [NSString stringWithFormat:@"do shell script \"%@ %@\" with administrator privileges", @"/usr/sbin/lsof",@"-c filecoord"];
NSLog(@"Running... %@",script);
NSAppleScript *appleScript = [[NSAppleScript new] initWithSource:script];
NSAppleEventDescriptor * eventResult = [appleScript executeAndReturnError:&errorInfo];

这个 apple 脚本并不是您所需要的,但它是一个开始。我不确定如何从应用程序内部完全请求对应用程序的根访问权限, 但是对于测试,您始终可以 运行 您的应用程序作为 root 并继续您的调试

如果这对您有任何帮助,请告诉我

需要在以下部分的“系统偏好设置”中添加辅助功能应用程序:

系统偏好设置 -> 安全与隐私 -> 隐私选项卡 -> 辅助功能(左侧)

请注意,在开发过程中,如果您在 Xcode 中 developing/running,则需要在此列表中包含 Xcode

我没有测试你的确切代码,但我测试了一些可比较的 swift 代码,如果在系统偏好设置中的那个位置添加了 Xcode,那么工作正常。

提示与技巧:

focussedElement 询问其支持的属性。使用函数:

AXError AXUIElementCopyAttributeNames(AXUIElementRef element, CFArrayRef  _Nullable *names);

Returns a list of all the attributes supported by the specified accessibility object.

AXError AXUIElementCopyParameterizedAttributeNames(AXUIElementRef element, CFArrayRef  _Nullable *names);

Returns a list of all the parameterized attributes supported by the specified accessibility object.

大多数未记录的属性都是不言自明的。

例如,将选定的文本作为属性字符串获取:

CFTypeRef markerRange = NULL;
AXError error = AXUIElementCopyAttributeValue(focussedElement, (CFStringRef)@"AXSelectedTextMarkerRange", &markerRange);
CFTypeRef result = NULL;
error = AXUIElementCopyParameterizedAttributeValue(focussedElement, (CFStringRef)@"AXAttributedStringForTextMarkerRange", markerRange, &result);