Установить экранную заставку macOS через командную строку в macOS 14 Sonoma.

Вопрос или проблема

В более ранних версиях 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 для восстановления желаемых параметров. Этот метод включает в себя:

  1. Предварительная настройка и сохранение конфигураций:

    • Ручное изменение настроек заставки через системные настройки для получения желаемой конфигурации.
    • Копирование текущего plist-файла конфигурации в отдельную директорию.
      cp ~/Library/Application\ Support/com.apple.wallpaper/Store/Index.plist /path/to/backup/config_1.plist
    • Настройка различных конфигураций и сохранение с аналогичным процессом.
  2. Программное восстановление конфигурации:

    • Копирование предварительно сохраненного plist-файла в оригинальное местоположение.
      cp /path/to/backup/config_1.plist ~/Library/Application\ Support/com.apple.wallpaper/Store/Index.plist
    • Перезапуск процесса WallpaperAgent:
      killall WallpaperAgent

Это решение позволяет эффективно управлять заставками в macOS 14, несмотря на изменения в системе.

Заключение

Таким образом, в macOS 14 Sonoma, для программного управления заставками лучше всего использовать метод копирования и замены предустановленных конфигурационных файлов. Это требует небольшой предварительной подготовки, но обеспечивает надежные результаты. В данном контексте ключевыми моментами являются использование ручного сохранения конфигураций и перезапуск системных процессов для применения изменений.

Такой подход позволяет обойти некоторые ограничения новейших версий macOS и сохранять высокий уровень контроля над системными настройками.

Оцените материал
Добавить комментарий

Капча загружается...