Как получить путь к файлу вложения (NSItemProvider) в Swift «Расширение общего доступа к приложениям»? - PullRequest
0 голосов
/ 20 ноября 2018

Примечание : я очень новичок для программирования Swift (только 2 дня), и я работаю над этим фрагментом кода как часть ElectronJS проект.Поэтому, пожалуйста, не обращайте внимания на мое невежество относительно основ языка.Спасибо.

Я создал приложение Swift, содержащее Share App Extension.

Требования :

  1. Share App Extensionдолжен иметь возможность отправлять absolute file path общих файлов в приложение-контейнер, т. е. если пользователь выбирает a file (abc.txt) from Desktop в Finder and Shares для моего приложения, то расширение приложения Share должно иметь возможность получить путь к файлу как

    /users/userName/Desktop/abc.txt
    

    С чем я сейчас борюсь, так это как получить путь к файлу для общего доступа с расширением общего доступа к приложениям.Каким образом можно получить путь к файлу вложений в NSExtensionItem, который доступен для Share App Extension или из какого-либо другого объекта?

    (я могу успешно использовать App Groups для обмена данными между Share App Extension и Application)

  2. В конечном проекте Share App Extension становится частью проекта ElectronJS , как упоминалосьранее.

    Существует ли стандартный способ передачи вышеупомянутой информации (путь к файлу вложений) из Share App Extension в процессы main / renderer приложения Electron.

1 Ответ

0 голосов
/ 21 ноября 2018

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

Решение для пункта № 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.

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