Как программно запланировать пробуждение системы с помощью системных настроек на Mac?

Я хотел бы программно разбудить Mac. Я начал с использования IOPMSchedulePowerEvent, однако этот метод требует прав администратора и привилегированных помощников. Я реализовал, и это работает, но слишком сложно.

Я искал лучший подход и обнаружил, что вы можете запланировать пробуждение системы, выбрав «Системные настройки» -> «Экономия энергии» -> «Расписание». Есть ли способ программно запланировать время пробуждения с помощью этого метода?

Спасибо.

Изменить: я понимаю, что системе требуется доступ администратора для планирования пробуждения системы и времени сна. Все в порядке. Я хотел бы иметь возможность сделать это программно. Если пользователь авторизует функциональность, это нормально, если его запрашивают только один раз. Последующие запросы на установку времени пробуждения системы не должны требовать авторизации пользователя.


person David    schedule 10.02.2011    source источник


Ответы (4)


Использование IOPMSchedulePowerEvent — правильное решение. Однако, если вы создаете привилегированный вспомогательный инструмент, вам нужно только один раз запросить у пользователя пароль. Код Apple BetterAuthorizationSample представляет собой пример того, как это сделать; есть также сторонняя модификация, AuthorizedTasksInCocoa, которая может быть немного проще в использовании ( я не пробовала).

person Nicholas Riley    schedule 19.02.2011
comment
@Nicholas, я уже реализовал помощник с помощью BAS, однако BAS использует launchd для запуска помощника. Таким образом, launchd требует, чтобы демон-помощник был установлен в /Library/LaunchDaemons. Это одобренный Apple способ, но для Mac App store Apple это не нравится, потому что это нарушает одно из их правил о расположении файла приложения. - person David; 19.02.2011
comment
Да, вы не можете сделать это, если хотите отправить в Mac App Store. Это по дизайну, и нет никакого способа обойти это. Сообщите об ошибке в Apple, если это проблема для вас, и, возможно, когда-нибудь они изменят правила. (Другие приложения, использующие авторизацию, имеют отдельные версии для Mac App Store, в которых функция авторизации удалена.) - person Nicholas Riley; 19.02.2011
comment
Ну, я знаю, что пробуждение системы из спящего режима возможно, потому что в магазине есть приложения-будильники, которые это делают (например, Aurora). Приложение Aurora требует единой аутентификации администратора и использует вспомогательный инструмент для вывода системы из спящего режима. Я не понимаю, как они могут не использовать launchd. - person David; 19.02.2011
comment
Вы можете создать помощник setuid внутри вашего пакета приложений (например, MoreAuthSample), но это также нарушает рекомендации App Store. Если версия Aurora из магазина приложений делает это (я не хочу тратить 10 долларов, чтобы узнать), то это нарушает правила. Версия Aurora не из App Store устанавливает вспомогательный инструмент setuid в /Library/Application Support/Aurora. - person Nicholas Riley; 19.02.2011
comment
Я купил версию Aurora в App Store, чтобы понять, как они это делают, и они действительно устанавливают вспомогательный инструмент в /Library/Application Support/Aurora при запуске приложения. Их помощником является агент, который создает приложение строки меню и удаляется из /Library/Application Support/Aurora, когда строка меню закрывается. Так что Aurora нарушает правила, используя метод, который не нравится Apple. Что я должен делать? Должен ли я использовать подход BAS, который у меня уже работает, или отступить и использовать MAS, устаревший метод, который не нравится Apple? Или я не должен использовать ни то, ни другое? - person David; 19.02.2011
comment
Я бы не сказал ни того, ни другого; либо не продавайте свое приложение через Mac App Store, либо приобретите отдельную версию с дополнительной функцией (если только она не является необходимой для вашего приложения). Потенциально вы можете перенести регистрации из одного приложения в другое следующим образом: red-sweater.com/blog/1678/this-app-is-your-app - person Nicholas Riley; 19.02.2011

У меня нет для вас полного ответа, но это должно очень помочь: http://www.opensource.apple.com/source/PowerManagement/PowerManagement-211/pmset/pmset.c

Что вам нужно сделать, так это запланировать kIOPMAutoWake. Найдите эту константу (не ее вариацию) в коде и начните читать. Это не НАСТОЛЬКО долго.

Возможно, вы даже можете использовать pmset напрямую, но это было бы довольно неэлегантно.

Что касается повышения, Apple говорит об этом в Secure Руководство по кодированию.

person Steven Fisher    schedule 19.02.2011

Я почти уверен, что для этого требуется доступ администратора. Например, параметры в Системных настройках -> Энергосбережение -> Расписание недоступны, если вы не вошли в систему как администратор или не прошли проверку подлинности в Системных настройках в качестве администратора. Если вы найдете способ сделать это без каких-либо специальных привилегий, я ожидаю, что Apple сочтет это ошибкой безопасности и исправит ее (таким образом, сломав вашу программу).

person Gordon Davisson    schedule 10.02.2011
comment
хорошо, требуется доступ администратора, но знаете ли вы способ программно получить доступ к системному планировщику сна и пробуждения? - person David; 19.02.2011

Вы можете запланировать события пробуждения с помощью IOPMSchedulePowerEvent через диспетчер питания. Вы можете запланировать немедленное пробуждение. pmset — это оболочка командной строки для диспетчера питания. В некоторых случаях вы также можете предотвратить сон с помощью IOCancelPowerChange.

Вы можете предотвратить сон или пробуждение, сгенерировав событие мыши или клавиши. Одним из способов генерации событий является CGPostKeyboardEvent.

==> Нормальный сон отличается от закрытого сна раскладушки. Чтобы повлиять на последнее, вы должны написать расширение ядра, такое как Insomnia.

person Akshay    schedule 22.02.2011