Коммуникация между приложениями для изолированного приложения Swift на macOS

Я создаю изолированное приложение macOS с помощью Swift, которое содержит дочернее приложение внутри.

Что я хочу реализовать:

  • Родитель может запускать несколько дочерних приложений
  • Родитель отправляет разный контент каждому дочернему приложению для отображения
  • И родительское, и дочернее приложение имеют свои собственные пользовательские интерфейсы.

Способ реализации, о котором я думал:

Распределенное уведомление

Распределенное уведомление с информационными объектами пользователя запрещено песочницей.

CFMessagePort

Для этого требуется, чтобы родительское и дочернее приложения находились в одной группе приложений и были подписаны с помощью соответствующих профилей предоставления. Но в Xcode это всегда None required в настройках профиля обеспечения, поэтому негде изменить настройки. Кроме того, нет никаких документов или сообщений, объясняющих, как использовать CFMessagePort в Swift. Я попробовал приведенный ниже код, но он каждый раз падает, так как песочница запрещает его.

let portName = "{team_identifier}.{app_group_identifier}.{port_name}"
let remote = CFMessagePortCreateRemote(nil, portName as CFString)
var returnData: Unmanaged<CFData>? = nil
if kCFMessagePortSuccess == CFMessagePortSendRequest(remote, 0, data as CFData, 1, 1, CFRunLoopMode.defaultMode.rawValue, &returnData) && nil != returnData {
    
}

Соединение NSXPC

Я не думаю, что XPC подходит для этой ситуации, так как XPC предназначен для связи между невидимой службой и клиентским приложением, в то время как служба встроена в приложение. Я сомневаюсь, что это сработает для модели родитель-ребенок.


Итак, есть ли лучший способ достичь моей цели? Я чувствую, что мне следует использовать CFMessagePort, но мне также нужна дополнительная помощь в том, как использовать его со Swift. Спасибо!


person Xiao Xiao    schedule 26.05.2021    source источник
comment
NSXPCConnection идеально подходит для этого. Какие проблемы вы видите?   -  person Rob Napier    schedule 28.05.2021
comment
У вас есть учетная запись разработчика?   -  person WikipediaBrown    schedule 28.05.2021
comment
@RobNapier Мне не хватает знаний о XPC. Насколько я понимаю, сама служба XPC не видна для конечного пользователя, и даже родительское приложение содержит пакет XPC, родитель не должен иметь возможность использовать службу XPC для инициирования запроса на отправку сообщения нескольким дочерним приложениям. Или вы можете дать мне пример структуры, как это сделать? Спасибо.   -  person Xiao Xiao    schedule 29.05.2021
comment
@WikipediaBrown Да, у меня уже много лет есть учетная запись разработчика, и у меня есть другие приложения в Mac App Store.   -  person Xiao Xiao    schedule 29.05.2021


Ответы (1)


Я думаю, что вам лучше всего использовать Apple Events, как я. Приложения в песочнице по умолчанию могут получать и отправлять Apple Events себе, но не могут отправлять Apple Events другим приложениям. Однако они могут отправлять события Apple, если

вы запрашиваете разрешение scripting-targets или разрешение на временное исключение Apple-events. Таким же образом, независимо от того, находится ли ваше приложение в песочнице, любое внешнее изолированное приложение, которое пытается взаимодействовать с вашим приложением, также должно запрашивать для этого соответствующие права.

Вы можете прочитать все об этом в Технических вопросах и ответах QA1888 .

Я также рекомендую вам ознакомиться с этим руководством по обработке событий Apple. в изолированном приложении и это руководство (часть 1 и часть 2) как обращаться с базовыми классами, которые вы можете использовать для создания Apple Events в Swift.

Если вы хотите получить более подробное объяснение и включить пример кода (однако он в основном на C), вы можете обратиться к справочным страницам Apple, а именно:

Если у вас возникнут проблемы, сообщите нам, поскольку я использую эту старую, но проверенную технологию для обработки большинства IPC между моим основным приложением и его помощниками.

person jvarela    schedule 31.05.2021