Запуск кода при изменении конфигурации питания macOS

Я хочу сделать две вещи:

  1. Выполнять код при изменении конфигурации питания системы. Например, когда система переходит с работы от внутренней батареи на использование адаптера питания; при изменении поставляемой мощности Power Delivery и т. д.

  2. Если возможно, для доступа к более подробной информации о конфигурации питания, чем system_profiler команда (или ее друг с графическим интерфейсом пользователя, приложение MacOS System Information) может предоставить.

Итак, самый простой способ взглянуть на конфигурацию питания - открыть служебное приложение "Информация о системе" и посмотреть под заголовком "Питание". Это даст вам что-то вроде этого:

Однако эта информация не обновляется активно. Для того, чтобы получить наиболее актуальную информацию, с точностью контроля над тем, что отображается, мы можем использовать yqинструмент вместе с system_profiler команда:

       $ system_profiler SPPowerDataType | yq -PC -I 4 r - 'Power.AC Charger Information'

… Который работает, потому что system_profilerвывод кажется действительным YAML. Приведенная выше команда выводит следующие строки:

… И хотя это определенно выглядит лучше и актуальнее, мне все равно приходится вручную вызывать команду (или, в лучшем случае, вызывать ее в фоновом цикле и следить за изменениями).

Я бы предпочел способ:

  • Получите доступ к этой информации - и, возможно, к дополнительной, более детальной информации - через API Objective-C, Swift, C или C++ без необходимости выполнять двоичный файл из /usr/sbin и проанализируем результаты;
  • Выполнять код, взаимодействующий с этим предполагаемым API, всякий раз, когда конфигурация питания системы должна измениться (вместо опроса или обновления вручную); и
  • Выполняйте эти вызовы в контексте, максимально приближенном к пользовательскому пространству.

Последнее условие не является нарушением условий сделки - я счастлив написать драйвер IOKit и разговаривать с ним из приложения через XPC, если это то, что нужно. Но я бы не возражал против решения на основе DriverKit или какого-то обратного вызова, работающего на уровне приложения - честно говоря, все, что работает.

Я поискал примеры того, как делать эти конкретные вещи, и остановился. Но: если у вас есть такой пример или вы знаете, с чего мне начать поиск, укажите мне, пожалуйста, на него (что бы это ни было).


† - Я говорю, что это "кажется действительным YAML", потому что это может быть просто совпадением того, как system_profilerформатирует свой вывод; нигде в доступной документации для этого инструмента не упоминается YAML, но спецификация YAML достаточно разрешительна, и, похоже, она работает. Если что трется вы неправильно или если вы хотите узнать больше, вы можете получить JSON-форматированный вывод, отфильтрованный в соответствии с приведенной выше информации, используя что - то вроде, например, jqинструмент, например:

       $ system_profiler -json SPPowerDataType | jq --indent 4 '.SPPowerDataType | .[] | select(._name? == "sppower_ac_charger_information")'

0 ответов

Другие вопросы по тегам