Создание соединения 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 ответа

Решение
  1. Не имеет значения, реализуете ли вы приложение пользовательского интерфейса как обычное приложение или агент запуска. Выберите то, что подходит лучше.
  2. Вы планируете иметь приложение пользовательского интерфейса и службу XPC? Это должно работать.
  3. Это работает для проектов Swift, Objective-C и смешанных языков.

Теперь я хочу установить однонаправленное соединение между ними, чтобы демон мог отправлять сообщения для отображения приложением пользовательского интерфейса.

Это не сработало для меня. Корневой процесс не может инициализировать связь с пользовательским процессом. Но это работало наоборот: если соединение инициируется пользовательским интерфейсом (вы создаете экземпляр NSXPCConnection в пользовательском интерфейсе и слушателя в демоне).

Я думаю, что вы должны прочитать Руководство по программированию Apple Daemons and Services: https://developer.apple.com/library/content/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/Introduction.html

  1. Пользовательский интерфейс, вероятно, должен быть выполнен как обычное приложение, которое взаимодействует с вашим демоном.

  2. Я не думаю, что XPC Services будут соответствовать вашим потребностям, поскольку вы сказали, что вам нужно поддерживать несколько пользователей.

служба XPC является частной и доступна только для основного приложения, в котором она находится.

  1. Да. Класс NSXPCConnection - это то, что вы, вероятно, используете, и его можно найти в Foundation, который совместим как с Swift, так и с Objective-C.
Другие вопросы по тегам