OP здесь
Я не мог заставить его работать простым способом, используя SMLoginItem
, и в итоге прибег к чрезвычайно утомительному методу вызова инструмента командной строки launchctl через NSTask, чтобы сообщить launchd , чтобы рассматривать мое вспомогательное приложение как элемент запуска.
По сути, вам нужно создать и поддерживать helper.launchd.plist в соответствующей папке библиотеки ( соответствующие папки ), которая содержит путь к исполняемому файлу вашего вспомогательного приложения и некоторыедругие конфигурации наиболее важны KeepAlive
, которые сообщат launchd автоматически открывать ваше приложение в случае его сбоя или закрытия пользователем, и RunAtLoad
, что приведет к запуску вашего приложения при входе в систему. Вот как выглядит мой helper.launchd.plist:
Затем вы можете зарегистрировать приложение-помощник через терминал с помощью команд:
launchctl bootstrap gui/$UID [path to your helper.launchd.plist]
для активации вашегопомощник как элемент входа в систему
и
launchctl bootout gui/$UID [path to your helper.launchd.plist]
для деактивации вашего помощника в качестве элемента входа в систему.
Вы можете использовать эти команды терминала из своего кода.Я сделал это с помощью NSTask, но я думаю, что могут быть более эффективные способы сделать это.
Обратите внимание, что $ UID - это internal variable
, который терминал автоматически расширяет до идентификатора пользователя текущего пользователя.прежде чем он передает аргумент gui / $ UID в инструмент командной строки launchctl.Мой UID 501, так что launchctl фактически получает ввод «gui / 501», а не «gui / $ UID».Я использую [NSString stringWithFormat:@"gui/%d", geteuid()]
для создания соответствующего аргумента домена пользователя для launchctl с Objective-C.
Случайные советы:
Обратите внимание, что my.prefpane можетнаходиться в разных местах в зависимости от того, установлена ли предварительная панель для всех или только для конкретного пользователя.
Я рекомендую вам добавить шаблон helper.launchd.plist в ваш проект.Затем вам нужно только отредактировать поле Program
в зависимости от пользователя и места установки префпана, а не создавать весь файл plist программно.
Я положил свой helper.launchd.plistв / Users / [User] / Library / LaunchAgents и я заметил, что эта папка не существует при новой установке, поэтому вам, возможно, придется проверить, действительно ли существует папка библиотеки, которая должна содержать ваш helper.launchd.plist, и создатьэто при необходимости.
Apple переписала launchctl в macOS 10.10 Yosemite, они добавили launchctl bootstrap
и launchctl bootout
в качестве замены для устаревших launchctl load
и launchctl unload
.Если вы хотите иметь обратную совместимость, вам, возможно, придется вернуться к load
и unload
на старых версиях macOS
Надеюсь, что это поможет и удачи в вашем проекте!