Использование 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/