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

通过macOS Accessibility API请求权限时触发段错误

解决macOS Rust程序请求辅助功能权限时的段错误问题

问题根源

你的代码触发段错误有两个核心原因:

  1. CFDictionary创建参数错误:调用CFDictionaryCreateMutable时传入了ptr::null()作为键和值的回调函数,Core Foundation字典需要合法的回调来处理CF对象的内存管理,空指针会导致操作字典时崩溃。
  2. 键类型不匹配:你用CString作为字典键,但AXIsProcessTrustedWithOptions要求字典的键是CFString类型,直接传递C字符串指针会导致类型不兼容,引发未定义行为。

修正后的代码

use accessibility_sys::AXIsProcessTrustedWithOptions;
use core_foundation_sys::base::{CFRelease, CFTypeRef, kCFAllocatorDefault};
use core_foundation_sys::dictionary::{
    CFDictionaryAddValue, CFDictionaryCreateMutable, kCFTypeDictionaryKeyCallBacks,
    kCFTypeDictionaryValueCallBacks,
};
use core_foundation_sys::number::kCFBooleanTrue;
use core_foundation_sys::string::CFStringCreateWithCString;
use std::ffi::CString;
use std::ptr;

fn main() {
    let mut is_allowed = false;
    unsafe {
        // 创建带默认回调的可变CF字典
        let options = CFDictionaryCreateMutable(
            kCFAllocatorDefault,
            1,
            &kCFTypeDictionaryKeyCallBacks,
            &kCFTypeDictionaryValueCallBacks,
        );

        // 将C字符串转为CFString(AX API要求的键类型)
        let key_cstr = CString::new("AXTrustedCheckOptionPrompt").unwrap();
        let key = CFStringCreateWithCString(
            kCFAllocatorDefault,
            key_cstr.as_ptr(),
            0x08000100, // kCFStringEncodingUTF8
        );

        // 添加键值对到字典
        CFDictionaryAddValue(options, key as CFTypeRef, kCFBooleanTrue as CFTypeRef);

        // 检查权限并弹出请求提示
        is_allowed = AXIsProcessTrustedWithOptions(options);

        // 释放CF对象,避免内存泄漏
        CFRelease(key);
        CFRelease(options);
    }
    println!("Accessibility permission enabled: {}", is_allowed);
}

关键修改说明

  • CFDictionary回调:使用kCFTypeDictionaryKeyCallBacks和kCFTypeDictionaryValueCallBacks,这是Core Foundation提供的默认回调,用于处理CF类型对象的引用计数和哈希比较。
  • CFString键:通过CFStringCreateWithCString将Rust的CString转换为CFString,确保类型符合AX API的要求。
  • 内存管理:显式释放创建的CFString和CFDictionary对象,避免内存泄漏。

额外注意事项

  • 确保你的程序有正确的代码签名:macOS对请求辅助功能权限的程序要求签名,未签名的程序可能无法弹出权限请求窗口,甚至被系统拦截。
  • 测试时重启程序:如果之前多次运行未授权的程序,系统可能会缓存状态,重启后再测试权限请求流程。

内容的提问来源于stack exchange,提问作者Jake

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 11:24:58