SMJobBless работает только с kSMDomainSystemLaunchd, требуется kSMDomainUserLaunchd
В документации говорится, что с SMJobBless вы можете использовать только kSMDomainSystemLaunchd
SMJobBless(kSMDomainSystemLaunchd, (CFStringRef)label, authRef, (CFErrorRef *)error);
Но как создать LaunchAgent внутри библиотеки LaunchAgents/ in users, которая выполняется при входе пользователя с использованием SMJobBless или аналогичного подхода?
0 ответов
Это старый вопрос, но, возможно, у кого-то такая же проблема.
Существует два основных подхода для добавления агента: использование системного API (ServiceManagement
Framework) или инструмент командной строки (launchctl
).
Используя API
SMJobBless
создает демон - процесс, работающий под root. Если вы хотите создать агент - процесс, запущенный под другим пользователем, используйте SMLoginItemSetEnabled
функция. Существует небольшая разница между этими функциями:
SMJobBless
регистрирует исполняемый файл иSMLoginItemSetEnabled
принимает идентификатор пакета в качестве основного параметра, поэтому для агента вам нужно создать приложение Какао.SMLoginItemSetEnabled
гораздо проще настроить.SMJobBless
копирует исполняемый файл вLibrary/PrivilegedHelperTools
и запускает его оттуда, а не из вашего пакета.SMLoginItemSetEnabled
запускает агент из вашего пакета, не копируя его.SMJobBless
требует от пользователя ввести пароль администратора;SMLoginItemSetEnabled
не беспокоит пользователя ничем, не требует root-прав.
Использование launchctl
SMLoginItemSetEnabled
регистрирует агента только для текущего пользователя. Если вам нужно добавить агент, который будет запускаться автоматически для любого пользователя, который входит в систему, поместите конфигурацию .plist
подать в /Library/LaunchAgents
(для этого вам понадобятся права root). Для загрузки сразу используйте launchctl
инструмент (из кода - через NSTask
). Документация по файлам конфигурации: man launchd.plist
,