Создание соединения Daemon / UI с использованием XPC
Моя платформа содержит общесистемный демон, основанный на смешанном коде C++/jective-c, который работает launchd
в соответствии с файлом plist с правильной конфигурацией /Library/LaunchDaemons/
,
С другой стороны, он содержит приложение на основе пользовательского интерфейса, созданное с использованием раскадровки, которое запускается из фона и определяется как LaunchAgent
(это означает, что он также управляется launchd
используя файл plist в /Library/LaunchAgents/
)
Теперь я хочу установить однонаправленное соединение между ними, чтобы демон мог отправлять сообщения для отображения приложением пользовательского интерфейса. сообщения могут содержать строки / числа или любые другие отображаемые данные.
Я проверил вариант с использованием подключения XPC и добавил NSXPCConnection
на мой демон, который разделяет выделенный протокол с сервером, реализованным на стороне пользовательского интерфейса, используя NSXPCListener
,
Я был бы рад получить отзывы и предложения о моем дизайне, особенно в следующих аспектах
1. Should I implement the UI as launchAgent
(I need to support multi-users, meaning that the daemon can send
different messages to each UI instance per user)
,
2. should I consider using dedicated `XPC service`.
Seems like Xcode has option to create XPC service,
but I don't know how should I "attach" the UI code inside ...
,
3. is it possible to have XPC client which runs objective-c
code while the XPC listener will run on swift code ?
Спасибо
2 ответа
- Не имеет значения, реализуете ли вы приложение пользовательского интерфейса как обычное приложение или агент запуска. Выберите то, что подходит лучше.
- Вы планируете иметь приложение пользовательского интерфейса и службу XPC? Это должно работать.
- Это работает для проектов Swift, Objective-C и смешанных языков.
Теперь я хочу установить однонаправленное соединение между ними, чтобы демон мог отправлять сообщения для отображения приложением пользовательского интерфейса.
Это не сработало для меня. Корневой процесс не может инициализировать связь с пользовательским процессом. Но это работало наоборот: если соединение инициируется пользовательским интерфейсом (вы создаете экземпляр NSXPCConnection в пользовательском интерфейсе и слушателя в демоне).
Я думаю, что вы должны прочитать Руководство по программированию Apple Daemons and Services: https://developer.apple.com/library/content/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/Introduction.html
Пользовательский интерфейс, вероятно, должен быть выполнен как обычное приложение, которое взаимодействует с вашим демоном.
Я не думаю, что XPC Services будут соответствовать вашим потребностям, поскольку вы сказали, что вам нужно поддерживать несколько пользователей.
служба XPC является частной и доступна только для основного приложения, в котором она находится.
- Да. Класс NSXPCConnection - это то, что вы, вероятно, используете, и его можно найти в Foundation, который совместим как с Swift, так и с Objective-C.