Обмен данными между расширением синхронизации Finder и XPC

Я работаю над расширением Finder Sync Extension для OS X и хочу использовать фоновую службу XPC.

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

Кому-нибудь повезло с этим? Есть ли лучший способ для фоновой службы по запросу? Можно ли разговаривать между двумя службами XPC?


person utahwithak    schedule 18.10.2014    source источник


Ответы (4)


Работая с некоторыми инженерами Apple, они поняли, что это проблема, и предложили использовать LoginItem, пока не будет найдено лучшее решение.

Итак, это своего рода служба XPC, просто постоянно работающая. Связь XPC доступна как для расширения, так и для хост-приложения.

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

person utahwithak    schedule 07.11.2014
comment
Не могли бы вы объяснить это поподробнее? Вы используете отдельное приложение в качестве службы XPC или объединяете его в основное приложение? У меня проблема в том, что NSXPCConnection, похоже, не открывается из плагина Finder в мою службу XPC, которая входит в состав основного приложения. - person Nickolay Olshevsky; 28.09.2015

Я реализовал связь MainApp ‹-> FinderSyncExtension через CFMessagePorts. См. Некоторые подробности в моем вопросе и ответе:

Как следует взаимодействовать между расширением Finder Sync и основным приложением?

person mixtly87    schedule 15.12.2016

Вы не можете напрямую взаимодействовать между контейнерным приложением и расширением, но можете сделать это косвенно, используя общие ресурсы. Я сделал именно то, что сделали вы, что совершенно неверно. Я надеюсь, что вы сохраните статус файла в базе данных, если не сохраните его, а затем поделитесь базой данных между приложением-контейнером и расширением. Я знаю, почему вы хотите использовать XPCService, как это указано в документе Apple FinderSync. (Фактически по соображениям производительности создайте NSXPCService для расширения и из XPCService, получите доступ к общей базе данных)

Для получения дополнительной информации о совместном использовании базы данных:

http://blog.sam-oakley.co.uk/post/92323630293/sharing-core-data-between-app-and-extension-in-ios-8

Надеюсь, это поможет тебе,

person Priya Raj    schedule 06.11.2014
comment
Совместное использование базы данных по-прежнему является рекомендуемым способом общения с FinderSyncExtension ‹-› MainApp? Как уведомить Finder, что он должен обновиться при обновлении базы данных? - person mixtly87; 07.12.2016
comment
Я бы сейчас настоятельно рекомендовал AppleScript. Я просто слепо следил за документами Apple и полностью забыл об AppleScript. Я использую AppleScript для общения. Нет, вам не нужно использовать общий контейнер, спасибо AppleScript :) - person Priya Raj; 17.05.2017

Я упорно игнорировал ответ utahwithak и все равно пытался заставить его работать. В конце концов мне пришлось задать аналогичный вопрос на форумах разработчиков Apple, и я наконец получил окончательный ответ о том, почему подключение расширения Finder Sync Extension к встроенной службе XPC не является жизнеспособной конструкцией системы.

По сути:

  • Расширение Finder Sync Extension, по сути, ведет себя как стороннее приложение в том смысле, что оно не имеет той же области, что и хост-приложение, чтобы иметь возможность установить соединение XPC со встроенной службой XPC.
  • Ответ utahwithak верен в том смысле, что для того, чтобы позволить расширению Finder Sync Extension взаимодействовать со службой XPC, ему необходимо быть элементом входа в систему XPC. Однако здесь есть некоторые предостережения:

    • This seems to be an accidental feature. Not sure if it's something that might eventually be fixed/removed
    • XPC должен быть всегда запущен, даже если в этом нет необходимости, в силу того, что он является элементом входа в систему.
    • Если это элемент входа в систему, пользователь должен будет явно включить эту функцию и иметь возможность отказаться.

Источник:

person Bryant Balatbat    schedule 09.01.2019