在早期版本的 macOS 中,我可以使用如下命令从 shell 脚本设置屏幕保护程序:
defaults -currentHost write com.apple.screensaver moduleDict -dict moduleName Drift path /System/Library/Screen\\ Savers/Drift.saver type 0
然而,在 macOS 14 中,系统似乎仍然写道对该属性进行设置后,屏幕保护程序将不再受该属性的控制。您可以通过以下方式读取该属性
defaults -currentHost read com.apple.screensaver
但设置它不会改变所选的屏幕保护程序。
如何以编程方式控制在 macOS 14 Sonoma 中选择哪个屏幕保护程序?
答案1
killall cfprefsd
在 Ventura 中,我在脚本中使用后更改了SelectedFolderPath
键com.apple.ScreenSaverPhotoChooser
,变化是立竿见影的。
但在 macOS 14 Sonoma 中,这还不够。如果我同时更新CustomFolderDict
字典值,它最终会改变设置,尽管更改可能需要几分钟才能反映在正在运行的屏幕保护程序中。
打开系统设置到屏幕保护程序将显示正确的文件夹名称(并且我假设 UI 下方的正确路径),但预览的缓存可能会延迟,直到使用上述设置CustomFolderDict
键刷新其他进程。
这是我用来调试行为的脚本,当 shell 位于要更改为的目录中时运行(pwd
):
#!/usr/bin/env bash
# write the SelectedFolderPath key
/usr/bin/defaults -currentHost write com.apple.ScreenSaverPhotoChooser SelectedFolderPath "$(pwd)"
# write the new CustomFolderDict key
/usr/bin/defaults -currentHost write com.apple.ScreenSaverPhotoChooser CustomFolderDict -dict identifier "$(pwd)" name "$(pwd | perl -pe 's/.*\///gmi')"
# restart cfprefsd to pickup the change (required in ventura)
killall cfprefsd
# did we write what we expected to?
/usr/bin/defaults -currentHost read com.apple.ScreenSaverPhotoChooser
# launch screensaver to test
open /System/Library/CoreServices/ScreenSaverEngine.app --background
# did anything change after screensaver launched?
sleep 5
/usr/bin/defaults -currentHost read com.apple.ScreenSaverPhotoChooser