2017-01-21 2 views
3

У меня есть оконное приложение и помощник без окон, сидящий внутри пакета приложений и работающий как элемент входа. Приложение может запускать и останавливать помощника, там все там. Проблема в том, что мне нужно создать между ними двунаправленный канал связи. И он должен работать как в песочнице, так и не в песочнице, желательно в OS X 10.7+.
Я исследовал тему и обнаружил, что XPC может обеспечивать одноранговое соединение. Я прочитал связанные документы Apple, а также несколько тем ниже:Mac OS X XPC как IPC между двумя приложениями

Is possible to use Mac OS X XPC like IPC to exchange messages between processes? How?
Communicate with another app using XPC
http://afewguyscoding.com/2012/07/ipc-easy-introducing-xpc-nsxpcconnection/
https://www.objc.io/issues/14-mac/xpc/

Но я не могу найти описание того, как я должен организовать свой XCode проект. У меня две цели: «Главное приложение» и «Приложение-помощник». Теперь мне нужно добавить третий, используя XPC Service, в качестве шаблона. Хорошо, но что делать дальше? Где этот пакет XPC должен быть расположен для обоих приложений? Обратите внимание, что помощник находится в основном пакете приложений, так как это элемент входа. Итак, мне нужна четкая инструкция или просто образец проекта XCode.

Спасибо, Alex

+0

Я сейчас работаю над этим - вы достигли какого-то прогресса? Моя нынешняя стратегия заключается в создании двух XPCServices, по одному для каждого приложения. Затем найти способ для услуг общаться друг с другом? Это растяжка, но я довольно убежден, что в данный момент невозможно напрямую общаться из одного приложения в другое. Я считаю, что должен быть XPCService между –

ответ

2

Хорошо для тех, кто борется с этим, я, наконец, смог 100% ПОЛУЧИТЬ связи, работающие между двумя прикладными процессами, используя NSXPCConnection

Ключ отметить, что вы может создать только NSXPCConnection для трех вещей.

  1. Служба XPCService. Вы можете подключиться к XPCService строго через a имя
  2. Служба маха. Вы также можете подключиться к службе Mach строго через имя
  3. NSXPCEndpoint. Это то, к чему мы обращаемся , для связи между двумя процессами приложения.

Проблема в том, что мы не можем напрямую передать NSXPCEndpoint из одного приложения в другое.

Это связано с созданием агента запуска механической обработки (See this example for how to do that), в котором находилось имущество NSXPCEndpoint. Одно приложение может подключаться к макссервису и устанавливать это свойство на свой собственный. [NSXPCListener anonymousListener].endpoint

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

После этого с помощью этой конечной точки может быть создан NSXPCConnection, который успешно установил мост между двумя приложениями. Я тестировал отправку объектов туда и обратно, и все работает так, как ожидалось.

Обратите внимание, что если ваше приложение песочнице, вы будет должны создать XPCService, как средний человек между приложением и Machservice

Я довольно накачкой, что я получил это working-- I» м довольно активны в SO, так что если кто-то заинтересованы в исходном коде, просто добавьте комментарий и я могу пройти через усилие, чтобы опубликовать более подробную информацию

некоторых препятствий я наткнулся на:

Вы должны launc ч вашего machservice, это линия:

OSStatus     err; 
    AuthorizationExternalForm extForm; 

    err = AuthorizationCreate(NULL, NULL, 0, &self->_authRef); 
    if (err == errAuthorizationSuccess) { 
     NSLog(@"SUCCESS AUTHORIZING DAEMON"); 
    } 
    assert(err == errAuthorizationSuccess); 

    Boolean    success; 
    CFErrorRef   error; 

    success = SMJobBless(
         kSMDomainSystemLaunchd, 
         CFSTR("DAEMON IDENTIFIER HERE"), 
         self->_authRef, 
         &error 
         ); 

Кроме того, каждый раз, когда вы восстановить ваш демон, вы должны выгрузить предыдущий запуск агент, с командами этот Баша:

sudo launchctl unload /Library/LaunchDaemons/com.example.apple-samplecode.EBAS.HelperTool.plist 
sudo rm /Library/LaunchDaemons/com.example.apple-samplecode.EBAS.HelperTool.plist 
sudo rm /Library/PrivilegedHelperTools/com.example.apple-samplecode.EBAS.HelperTool 

(С вашего соответствующими идентификаторы, конечно)