Использование LaunchAgent в изолированной программной среде приложения Mac

Как бы вы использовали LaunchAgent внутри песочницы? Я хочу распространять комплект приложений LaunchAgent без пользовательского интерфейса внутри моего основного приложения, которое можно запускать по требованию. Причина, по которой я хочу это вместо службы XPC, заключается в KeepAlive вариант, который помешает launchd от автоматического уничтожения моего процесса, когда он простаивает. Эта опция не существует в службах XPC.

В документации сказано, что есть список, который нужно скопировать в ~/Library/LaunchAgentsи это, очевидно, невозможно внутри песочницы. Есть ли какой-нибудь системный API, который бы обрабатывал копирование списка для меня? Я видел пример кода Apple SMJobBless, но похоже, что он предназначен для регистрации привилегированного LaunchDaemon, а не непривилегированного LaunchAgent.

2 ответа

Решение

API, который вы ищете SMLoginItemSetEnabled(), Вам нужно будет упаковать свой долго работающий агент как обычный пакет.app и поместить его в пакет основного приложения по адресу Content/Library/LoginItems,

Затем во время выполнения в главном приложении вы можете использовать SMLoginItemSetEnabled() позвоните с идентификатором пакета агента, чтобы включить и отключить ваш агент. Если ваше основное приложение закрывается, агент остается в живых. Если пользователь выходит из системы и снова входит в систему или перезагружается, ОС перезапустит ваш агент, когда пользователь снова войдет в систему.

Обновление: как отмечает Дмитрий, документация больше не идет с образцом, который я упоминал ранее, но другой пример проекта кода Apple, для App Sandbox, демонстрирует тот же API (см. Файл NSXPCConnection+LoginItem.m).

Страница документации теперь не содержит пример проекта, поэтому вот она: http://rhult.github.io/articles/sandboxed-launch-on-login/

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