通过macOS Accessibility API请求权限时触发段错误
解决macOS Rust程序请求辅助功能权限时的段错误问题
问题根源
你的代码触发段错误有两个核心原因:
- CFDictionary创建参数错误:调用
CFDictionaryCreateMutable时传入了ptr::null()作为键和值的回调函数,Core Foundation字典需要合法的回调来处理CF对象的内存管理,空指针会导致操作字典时崩溃。 - 键类型不匹配:你用
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
相关产品推荐
相关产品推荐

