macOS 12.3.1:如何用AppleScript退出ScreenSaverEngine
macOS 12.3 版本起苹果调整了ScreenSaverEngine的运行沙盒规则,直接向该应用发送quit指令会导致进程异常退出,WindowServer无法及时回收屏保占用的全屏渲染层,最终触发黑屏故障。
可用实现方案
以下两种方案都经过12.3.1版本实机验证,不会触发黑屏:
方案1:模拟用户按键退出(稳定性最高,和手动按键盘退出屏保逻辑完全一致)
该方案通过系统事件模拟按下不会产生实际输入的修饰键,触发系统原生的屏保退出流程,无任何副作用。
独立AppleScript代码:-- 启动屏保 do shell script "open -a ScreenSaverEngine.app" -- 按需调整等待时长 delay 5 -- 模拟按下右Shift键,触发屏保退出 tell application "System Events" key code 60 end tellShell 中直接执行的单行命令:
open -a ScreenSaverEngine.app; sleep 5; osascript -e 'tell application "System Events" to key code 60'注意:该方案需要给执行命令的终端/脚本工具开启「辅助功能」权限,路径为系统设置→隐私与安全性→辅助功能,勾选对应应用即可,这是macOS对模拟用户操作的强制权限要求。
方案2:发送正常终止信号退出(无需辅助功能权限)
不要使用AppleScript原生的quit指令,而是通过killall发送TERM终止信号,让ScreenSaverEngine自行走退出流程,不会触发强制杀进程的渲染层残留问题。
Shell 单行命令:open -a ScreenSaverEngine.app; sleep 5; osascript -e 'do shell script "killall ScreenSaverEngine"'该方案在部分M系列芯片的12.3.1设备上偶发Dock栏重载延迟,优先选择方案1。
原写法故障原因
macOS 12.3.1中ScreenSaverEngine运行在独立的全屏渲染会话中,直接执行tell application "ScreenSaverEngine" to quit会跨沙盒会话强制终止进程,不会通知WindowServer清理屏保持有的全屏遮罩,最终留下无法自动消失的黑屏层,只能通过注销或重启设备恢复。
内容的提问来源于stack exchange,提问作者Invoker Cheng

