Лучший способ зарегистрировать элемент входа в панели настроек? - PullRequest
0 голосов
/ 23 октября 2018

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

У меня есть оба приложения в одном проекте, и мне удалось добавить helper.app в my.prefpane App Bundle, но я не могу понять, как включить helper.app в качестве элемента входа ...


Я попытался использовать SMLoginItemSetEnabled, потому что это, кажется, самое элегантное решение - но я не могу заставить его работать ...

Я получаю эту ошибку:

"Не удалось найти логинitem [идентификатор пакета] в связке вызывающего абонента "

Я думаю, проблема в том, что эта функция only работает, если helper.app находитсяв каталоге “Contents/Library/LoginItems” основного комплекта приложений, но «основное приложение», которое вызывает эту функцию, выглядит как System Preferences.app , а не my.prefpane , которое содержит helper.app .Я не могу написать helper.app в Системные настройки.app Bundle, конечно ...


Есть ли обходной путь для этого?Не могли бы вы расширить функциональность функции SMLoginItemSetEnabled или что-то в этом роде?Или я должен использовать совершенно другой подход?

Edit;Есть ли тег для элементов входа?Я чувствую, что мои теги действительно плохи ..

1 Ответ

0 голосов
/ 26 июля 2019

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

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

...