Xcode 15中macOS Swift应用辅助功能权限配置问题
macOS Swift应用Accessibility权限问题排查
我正在开发一款macOS Swift应用,需要通过Accessibility框架获取其他应用的UI元素。已经在Hardened Runtime中勾选了AppleEvents权限,也在Info.plist里添加了NSAppleEventsUsageDescription描述,但仍然遇到权限问题。我用以下代码测试权限状态:
import SwiftUI import Cocoa import ApplicationServices struct ContentView: View { @State private var message: String = "正在检查Accessibility权限..." var body: some View { VStack { Text("Accessibility测试") .font(.largeTitle) .padding() Text(message) .padding() .multilineTextAlignment(.center) } .padding() .onAppear { checkAccessibilityPermissions() } } func checkAccessibilityPermissions() { DispatchQueue.global(qos: .background).async { let systemPreferencesApp = NSRunningApplication.runningApplications(withBundleIdentifier: "com.apple.systempreferences").first guard let systemPreferencesApp = systemPreferencesApp else { DispatchQueue.main.async { self.message = "系统偏好设置未运行。" } return } let pid = systemPreferencesApp.processIdentifier let axApp = AXUIElementCreateApplication(pid) var attributeValue: CFTypeRef? let result = AXUIElementCopyAttributeValue(axApp, kAXFocusedWindowAttribute as CFString, &attributeValue) DispatchQueue.main.async { if result == .success { self.message = "Accessibility权限已正确配置。" } else { self.message = "Accessibility权限配置错误。错误码: \(result.rawValue)" } } } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
解决要点
- 权限类型区分:AppleEvents和Accessibility是完全独立的权限,Hardened Runtime里的AppleEvents勾选不覆盖Accessibility权限需求。必须在系统偏好设置→安全性与隐私→隐私→辅助功能中,手动将你的应用加入授权列表。
- 主动触发权限申请:原代码直接尝试访问其他应用UI元素,没有触发系统权限弹窗。可以先用
AXIsProcessTrusted()检查权限状态,未授权时调用AXIsProcessTrustedWithOptions()唤起申请弹窗。 - 补充Info.plist描述:除了
NSAppleEventsUsageDescription,还需要添加NSAccessibilityUsageDescription键,明确说明应用需要Accessibility权限的用途,否则系统弹窗的说明会缺失。 - 调试细节:Xcode调试时,确保授权的是Xcode进程或编译后的应用包;开启Hardened Runtime的同时,需勾选「Disable Library Validation」,避免权限验证失败。
修改后的权限检查代码
func checkAccessibilityPermissions() { DispatchQueue.global(qos: .background).async { // 先检查权限状态 let isTrusted = AXIsProcessTrusted() if !isTrusted { // 触发系统权限申请弹窗 let options: NSDictionary = [kAXTrustedCheckOptionPrompt.takeRetainedValue() as NSString: true] _ = AXIsProcessTrustedWithOptions(options) } let systemPreferencesApp = NSRunningApplication.runningApplications(withBundleIdentifier: "com.apple.systempreferences").first guard let systemPreferencesApp = systemPreferencesApp else { DispatchQueue.main.async { self.message = "系统偏好设置未运行。" } return } let pid = systemPreferencesApp.processIdentifier let axApp = AXUIElementCreateApplication(pid) var attributeValue: CFTypeRef? let result = AXUIElementCopyAttributeValue(axApp, kAXFocusedWindowAttribute as CFString, &attributeValue) DispatchQueue.main.async { if result == .success { self.message = "Accessibility权限已正确配置。" } else { self.message = "Accessibility权限配置错误。错误码: \(result.rawValue)" } } } }
内容的提问来源于stack exchange,提问作者HNT
相关产品推荐
相关产品推荐

