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 функция. Существует небольшая разница между этими функциями:

  1. SMJobBless регистрирует исполняемый файл и SMLoginItemSetEnabled принимает идентификатор пакета в качестве основного параметра, поэтому для агента вам нужно создать приложение Какао.

  2. SMLoginItemSetEnabled гораздо проще настроить.

  3. SMJobBless копирует исполняемый файл в Library/PrivilegedHelperTools и запускает его оттуда, а не из вашего пакета. SMLoginItemSetEnabled запускает агент из вашего пакета, не копируя его.

  4. SMJobBless требует от пользователя ввести пароль администратора; SMLoginItemSetEnabled не беспокоит пользователя ничем, не требует root-прав.

Использование launchctl

SMLoginItemSetEnabled регистрирует агента только для текущего пользователя. Если вам нужно добавить агент, который будет запускаться автоматически для любого пользователя, который входит в систему, поместите конфигурацию .plist подать в /Library/LaunchAgents (для этого вам понадобятся права root). Для загрузки сразу используйте launchctl инструмент (из кода - через NSTask). Документация по файлам конфигурации: man launchd.plist,

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