Лучший способ зарегистрировать элемент входа в панели настроек?

Я пытаюсь создать панель настроек, которая регистрирует вспомогательное приложение в качестве элемента входа.

У меня есть оба приложения в одном проекте, и мне удалось добавить 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

Надеюсь, это поможет и удачи в вашем проекте!

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