带有 AXTextMarker 的 WebKit 应用程序上的 macOS 可访问性 API
macOS accessibility API on WebKit applications with AXTextMarker
我需要从 Safari、Mail 等 webkit 应用程序访问数据。我可以在 Accessibility Inspector
中看到 :AXTextMarker
和 AXTextMarkerForRange
.
我尝试了通常的方法来获取此信息:
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);
我需要从 Safari、Mail 等 webkit 应用程序访问数据。我可以在 Accessibility Inspector
中看到 :AXTextMarker
和 AXTextMarkerForRange
.
我尝试了通常的方法来获取此信息:
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);