Разработка плагинов - встраивание пользовательских фреймворков в XPC - PullRequest
0 голосов
/ 04 июня 2019

Недавно я создал пользовательский фреймворк, который планируется использовать повторно для нескольких проектов. Суть в том, что это для плагина, и зная, что мы не можем просто встроить фреймворк в пакет плагина из-за столкновений символов и чего-то другого, я подумываю просто встроить его в XPC плагина. Напомним, что этот каркас будет использоваться для запуска пользовательских интерфейсов, таких как контроллер представления, представления и использование некоторых делегированных в него делегатов, чтобы плагин должен был стать владельцем (на что я надеюсь). Это подводит меня к моему вопросу: возможно ли, чтобы другой процесс стал владельцем объектов, созданных в XPC? Я довольно новичок в использовании фреймворков, поэтому я часами пытался собрать вещи в XCode на основе уроков, которые я нашел в Интернете, к сожалению, безрезультатно.

1 Ответ

0 голосов
/ 04 июня 2019

A framework - это набор кода и ресурсов, которые могут использоваться и повторно использоваться несколькими приложениями. Он может быть встроен в ваше приложение, быть частью операционной системы (на самом деле весь Cocoa - это набор фреймворков) или динамически размещаться и программно загружаться во время выполнения. После загрузки код, классы и ресурсы инфраструктуры представляются приложению, как если бы они были скомпилированы непосредственно в хост-приложение. Ключ заключается в том, что код выполняется непосредственно в области памяти вашего процесса.

XPC является межпроцессным средством связи. Это позволяет одному процессу отправлять и получать сообщения с другим процессом. Его нельзя использовать для общения с самим собой.

Вы не можете «стать владельцем» объекта с помощью XPC. Все сообщения XPC сериализуют («архивируют» на языке какао) любой объект и десериализуют этот объект на принимающей стороне. Второй процесс теперь как точная копия оригинального объекта; это не ссылка на исходный объект и ограничена границами его процесса.

Если ваш второй процесс должен что-то отображать, у вас есть (в основном) три варианта:

(1) Сделайте второй процесс своим собственным приложением. Второй процесс может быть полноценным приложением Какао с окнами и так далее. Вы можете сделать его «вспомогательным» приложением, чтобы оно не имело меню или не появлялось в доке. См. LSUIPresentationMode Свойство Info.plist и / или NSApplication.activationPolicy.

(2) Продвинутая техника заключается в использовании IOSurface. IOSurface - это, по сути, метод, с помощью которого второй процесс (ваша служба XPC) может рисовать непосредственно в окне вашего приложения. Опять же, объекты рисования все еще существуют - и полностью изолированы - во втором процессе; но то, что они рисуют, будет отображаться в вашем приложении, как если бы они были объектами локального просмотра. (Вот как работает Safari; каждая страница браузера отображается отдельным фоновым процессом, рисующим на поверхности.)

(3) Используйте IOSurface для бедняков: отправьте ваши данные во второй процесс, пусть он отобразит результаты во что-то (массив пикселей, TIFF, PNG, ...), которое может быть сериализовано и отрисовано хост-приложение, затем используйте XPC для отправки этого отрендеренного изображения обратно в хост-приложение для отображения.

Руководство по программированию демонов и служб

IOSurface

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