Я делюсь решениями ниже.Помните, что это могут быть не самые лучшие решения, и я открыт для предложений.
Решение для пункта № 1:
Инструктаж : пользователь выбирает файлыиз Finder
для совместного использования через Share App Extension
приложения, которое зарегистрировано в ОС, если extension context
выбора соответствует номеру Share App Extension
.После этого Share App Extension
получает extension context
вместе с NSExtensionItem
.Объект NSExtensionItem
содержит объект NSItemProvider
, который является объектом, который вы получите для всех файлов (вложений), к которым предоставлен общий доступ с помощью Share App Extension
.
Теперь, для каждого типа элемента, который вы получаете черезShare App Extension
, после поиска данных, которые ваша функция распознает с помощью hasItemConforminToTypeIdentifier(_:)
, вы можете использовать UTI (универсальный идентификатор типа) для идентификации своих данных.
Средство устранения : Здесь решающее значение имеетчасть состоит в том, чтобы понять, что нужно рассматривать их входные файлы как прежде всего типа: kUTTypeURL
Затем в completionHandler
для метода loadItem
объекта NSItemProvider
вы получите NSURL
, который в основном представляет собой путь к файлу, который я искал.
Решение для пункта № 2:
Брифинг : Share App Extension
может быть написано на языке Swift, а главное приложение в нашем проекте - нет!Основное приложение написано в ElectronJS
, что очень далеко от интеграции со Swift!За исключением того факта, что приложение, написанное на ElectronJS
, может быть упаковано в виде dmg
приложения, очень мало возможностей для интеграции между ElectronJS и Swift в том, что касается взаимосвязи языка и структуры.
Предпосылка : Итак, предпосылка заключается в том, чтобы иметь возможность обмениваться ранее извлеченными путями, которые будут переданы из Share App Extension
(написано в Swift) в основное приложение (написано в ElectronJS).Теперь, если бы основным приложением было приложение Какао, все было бы намного проще.Если они оба принадлежат одному и тому же App group
, то с помощью API Swift они могли бы синхронно читать / записывать в общую память.Однако проблема возникает, поскольку эти API не доступны в ElectronJS
.Одним из способов решения этой проблемы может быть запуск кода Swift в изолированной среде в приложении ElectronJS
с использованием библиотек nodeJS.Однако в изолированной среде есть свои нюансы в обмене данными.Итак, я пока приостановил этот подход.
Итак, подход, который я выбрал прямо сейчас, заключается в использовании App Data Directory
для обмена этой промежуточной информацией.Share App Extension
будет записывать информацию о пути к файлу в каталоге App Data
приложения, а приложение ElectronJS будет использовать API-интерфейсы nodeJs для доступа к этой информации.Имейте в виду, что это очень примитивный подход и требует незначительных усилий, но требования для этого конкретного случая в любом случае не требуют строгих мер безопасности.
Тем не менее, я положительно ищу лучший способ решения проблемы #2.