You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 15:13:12