Вопрос или проблема
В более ранних версиях 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?
В Ventura я использовал killall cfprefsd
в своих скриптах после изменения ключа SelectedFolderPath
для com.apple.ScreenSaverPhotoChooser
, изменение происходило сразу.
Однако в macOS 14 Sonoma этого недостаточно. Настройка в итоге изменяется, если я также обновляю значение словаря CustomFolderDict
одновременно, хотя это может занять несколько минут, прежде чем изменение отразится в запущенной экранной заставке.
Открытие Системных настроек до экранной заставки покажет правильное имя папки (и, я полагаю, правильный путь под интерфейсом), но кэш превью может задерживаться, пока другой процесс не обновится с вышеуказанным установленным ключом CustomFolderDict
.
Вот скрипт, который я использую для отладки поведения, выполняемый, когда shell находится в директории для изменения (pwd
):
#!/usr/bin/env bash
# записать ключ SelectedFolderPath
/usr/bin/defaults -currentHost write com.apple.ScreenSaverPhotoChooser SelectedFolderPath "$(pwd)"
# записать новый ключ CustomFolderDict
/usr/bin/defaults -currentHost write com.apple.ScreenSaverPhotoChooser CustomFolderDict -dict identifier "$(pwd)" name "$(pwd | perl -pe 's/.*\///gmi')"
# перезапустить cfprefsd для применения изменений (требуется в ventura)
killall cfprefsd
# записали ли мы то, что ожидали?
/usr/bin/defaults -currentHost read com.apple.ScreenSaverPhotoChooser
# запустить экранную заставку для тестирования
open /System/Library/CoreServices/ScreenSaverEngine.app --background
# изменилось ли что-то после запуска экранной заставки?
sleep 5
/usr/bin/defaults -currentHost read com.apple.ScreenSaverPhotoChooser
Я смог решить эту проблему с помощью этого gist: https://github.com/JohnCoates/Aerial/issues/1332
Вместо попыток изменить файлы plist, я настраиваю параметры экранной заставки на желаемую конфигурацию, копирую файл plist в другое место, устанавливаю другую конфигурацию, копирую этот файл plist и так далее. Это работает для меня, но обратите внимание, что я почти уверен, что plist также содержит настройки, такие как фон рабочего стола, и т.д.
Затем для программного управления настройкой экранной заставки я могу скопировать файл конфигурации plist, соответствующий нужному файлу, обратно в директорию и запустить killall WallpaperAgent
# создать резервную копию текущей конфигурации как `config_1.plist
cp ~/Library/Application\ Support/com.apple.wallpaper/Store/Index.plist /path/to/some/dir/config_1.plist
# скопировать конфигурацию в директорию
cp /your/backup/config_1.plist ~/Library/Application\ Support/com.apple.wallpaper/Store/Index.plist
killall WallpaperAgent
Ответ или решение
В macOS 14 Sonoma произошли изменения в том, как система управляет настройками заставки, что усложняет процесс программного изменения выбранной заставки через командную строку. В более ранних версиях macOS таких трудностей не возникало, но теперь стандартные команды изменения plist-файлов могут не давать ожидаемого результата.
Проблема и Решение
Проблема
В macOS 14, команда defaults -currentHost write com.apple.screensaver moduleDict
больше не позволяет изменить активную заставку напрямую. Это вызвано изменениями в системе управления настройками системы. Попытка принудительного обновления с помощью killall cfprefsd
также не всегда дает мгновенный эффект.
Решение
Решением может стать процесс копирования предустановленных файлов конфигураций plist для восстановления желаемых параметров. Этот метод включает в себя:
-
Предварительная настройка и сохранение конфигураций:
- Ручное изменение настроек заставки через системные настройки для получения желаемой конфигурации.
- Копирование текущего plist-файла конфигурации в отдельную директорию.
cp ~/Library/Application\ Support/com.apple.wallpaper/Store/Index.plist /path/to/backup/config_1.plist
- Настройка различных конфигураций и сохранение с аналогичным процессом.
-
Программное восстановление конфигурации:
- Копирование предварительно сохраненного plist-файла в оригинальное местоположение.
cp /path/to/backup/config_1.plist ~/Library/Application\ Support/com.apple.wallpaper/Store/Index.plist
- Перезапуск процесса WallpaperAgent:
killall WallpaperAgent
- Копирование предварительно сохраненного plist-файла в оригинальное местоположение.
Это решение позволяет эффективно управлять заставками в macOS 14, несмотря на изменения в системе.
Заключение
Таким образом, в macOS 14 Sonoma, для программного управления заставками лучше всего использовать метод копирования и замены предустановленных конфигурационных файлов. Это требует небольшой предварительной подготовки, но обеспечивает надежные результаты. В данном контексте ключевыми моментами являются использование ручного сохранения конфигураций и перезапуск системных процессов для применения изменений.
Такой подход позволяет обойти некоторые ограничения новейших версий macOS и сохранять высокий уровень контроля над системными настройками.