Лучший способ зарегистрировать элемент входа в панели настроек?
Я пытаюсь создать панель настроек, которая регистрирует вспомогательное приложение в качестве элемента входа.
У меня есть оба приложения в одном проекте, и мне удалось добавить helper.app в пакет приложений my.prefpane, но я не могу понять, как включить helper.app в качестве элемента входа...
Я пытался с помощью SMLoginItemSetEnabled
потому что это кажется самым элегантным решением - но я не могу заставить его работать...
Я получаю эту ошибку:
"Не удалось найти элемент входа в систему [идентификатор пакета] в пакете вызывающего"
Я думаю, что проблема в том, что эта функция работает, только если helper.app находится в основном комплекте приложений “Contents/Library/LoginItems”
каталог, но "основное приложение", которое вызывает эту функцию, кажется System Preferences.app, а не my.prefpane, который содержит helper.app. Конечно, я не могу написать helper.app в System Preferences.app 's Bundle...
Есть ли обходной путь для этого? Не могли бы вы расширить функциональность SMLoginItemSetEnabled
функция или что-то в этом роде? Или я должен использовать совершенно другой подход?
Редактировать; Есть ли тег для элементов входа? Я чувствую, что мои теги действительно плохи..
0 ответов
ОП здесь
Я не мог заставить его работать простым способом, используя 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 может находиться в разных местах в зависимости от того, установлена ли prefpane для всех или только для определенного пользователя.
Я рекомендую вам добавить в свой проект шаблон helper.launchd.plist. Тогда вам нужно только отредактировать
Program
зависит от пользователя и места установки prefpane, а не программно создавать весь файл plist.Я поместил свой helper.launchd.plist в /Users/[User]/Library/LaunchAgents и заметил, что эта папка не существует при новой установке, поэтому вам, возможно, придется проверить, должна ли папка библиотеки содержать ваш помощник.launchd.plist действительно существует и при необходимости создайте его.
Apple переписала launchctl в macOS 10.10 Yosemite, добавили
launchctl bootstrap
а такжеlaunchctl bootout
в качестве замены устаревшегоlaunchctl load
а такжеlaunchctl unload
. Если вы хотите иметь обратную совместимость, вам, возможно, придется вернуться кload
а такжеunload
в старых версиях macOS
Надеюсь, это поможет и удачи в вашем проекте!