MacOS下使用SFML开发,如何避免每次编译后重设系统权限?
MacOS 10.14.2下SFML鼠标定位权限重复授权问题解决方案
方案1:为编译产物添加固定代码签名
MacOS权限系统通过程序的代码签名/哈希值识别应用,每次编译后程序哈希变化会被判定为新应用。用自签名证书固定签名,可让系统识别为同一应用:
- 打开「钥匙串访问」→「证书助理」→「创建证书」,自定义名称(比如
MyDevSign),证书类型选「代码签名」,存储位置设为「登录」,完成创建。 - 修改编译脚本,在编译结束后添加签名命令:
后续每次编译后自动执行签名,系统会保留已授权的权限。codesign -s "MyDevSign" ./你的程序文件名
方案2:将可执行文件打包为标准.app应用包
MacOS对.app格式应用的权限识别更稳定,替换包内可执行文件不会触发权限重新验证:
- 创建如下目录结构:
YourGame.app/ ├─ Contents/ │ ├─ MacOS/ │ │ └─ 编译好的可执行文件 │ └─ Info.plist - 在
Info.plist中添加基础配置(示例):<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>CFBundleName</key> <string>YourGame</string> <key>CFBundleExecutable</key> <string>你的可执行文件名</string> <key>CFBundleIdentifier</key> <string>com.yourname.yourgame</string> </dict> </plist> - 第一次运行
YourGame.app时在系统设置中添加权限,后续仅需替换MacOS目录下的可执行文件即可,无需重新授权。
方案3:临时禁用权限验证(仅开发调试用)
适合快速调试,重启后失效,不建议用于正式发布:
- 执行终端命令关闭辅助功能权限验证:
sudo defaults write /Library/Preferences/com.apple.security.devicecontrol.plist DisableDeviceControl -bool true - 重启系统后,程序可直接调用鼠标定位功能。调试完成后恢复设置:
再次重启系统生效。sudo defaults delete /Library/Preferences/com.apple.security.devicecontrol.plist DisableDeviceControl
方案4:直接调用CoreGraphics API替代SFML封装
绕开SFML的鼠标定位方法,直接调用系统CoreGraphics框架实现,配合签名解决权限问题:
- 编写自定义鼠标定位函数:
#include <CoreGraphics/CoreGraphics.h> void setMousePos(int x, int y) { CGEventRef moveEvent = CGEventCreateMouseEvent( NULL, kCGEventMouseMoved, CGPointMake(static_cast<CGFloat>(x), static_cast<CGFloat>(y)), kCGMouseButtonLeft // 仅占位,不影响鼠标移动 ); CGEventPost(kCGHIDEventTap, moveEvent); CFRelease(moveEvent); } - 编译时链接CoreGraphics框架:
g++ your_source.cpp -o your_program -lsfml-graphics -lsfml-window -lsfml-system -framework CoreGraphics - 为编译后的程序添加固定签名,权限一次授权即可重复使用。
内容的提问来源于stack exchange,提问作者John Ziegler
相关产品推荐
相关产品推荐

