Как получить элементы из контекста расширения в расширении Share для iOS?

Как только мое расширение общего доступа загружено, не всегда и не все сразу видно пользователю. Наиболее распространенным является то, что там вы можете увидеть изображение, количество изображений и текст содержимого. Однако бывают случаи, когда информации гораздо больше.

  • Как получить к ним доступ?

Я знаю, что внутри SLComposeServiceViewController есть extensionContext и его свойство inputItems.

Хорошо, поэтому я вовремя остановил отладчик и распечатал на консоли некоторые вещи с помощью следующей команды:

po (extensionContext!.inputItems[0] as! NSExtensionItem).userInfo![NSExtensionItemAttachmentsKey]
  • Правильно ли это сделать?
  • Обычно используется один элемент ввода?

было два объекта NSItemProvider в качестве вложений к первому NSExtensionItem

введите здесь описание изображения

Хорошо, тогда я распечатываю первое из вложений:

введите здесь описание изображения

  • Как получить это изображение из этого NSItemProvider и URL из следующего? Можете ли вы предоставить какой-нибудь код?

Я полагаю, мы будем использовать

loadItemForTypeIdentifier(_:options:completionHandler:)

но не знаю как.


person Bartłomiej Semańczyk    schedule 05.11.2015    source источник


Ответы (2)


  1. import MobileCoreServices

  2. Существует простая функция, которую вы можете применить к своему коду:

    private func fetchAndSetContentFromContext() {
    
        guard let extensionItems = extensionContext?.inputItems as? [NSExtensionItem] else {
            return
        }
    
        for extensionItem in extensionItems {
            if let itemProviders = extensionItem.attachments as? [NSItemProvider] {
                for itemProvider in itemProviders {
                    if itemProvider.hasItemConformingToTypeIdentifier(kUTTypeText as String) {
    
                        itemProvider.loadItemForTypeIdentifier(kUTTypeText as String, options: nil, completionHandler: { text, error in
    
                        })
                    }
                }
            }
        }
    }
    
person Bartłomiej Semańczyk    schedule 05.11.2015
comment
привет, если мне нужно обработать изображение и видео, я вызываю loadItemForTypeIdentifier 2 раза? - person famfamfam; 27.03.2021

Итак, теперь вы знаете, как использовать метод loadItemForTypeIdentifier(_:options:completionHandler:) для загрузки нужных данных.

В ваших снимках вы хотите получить изображения и объекты URL.

Давай начнем.

guard
  let items = extensionContext?.inputItems as? [NSExtensionItem],
  let item = items.first,
  let attachments = item.attachments
else { return }

var image: UIImage?
var url: URL?

let semaphore = DispatchSemaphore(value: 2)
for attachment in attachments {
  if attachment.hasItemConformingToTypeIdentifier(kUTTypeImage as String) {
    attachment.loadItem(forTypeIdentifier: kUTTypeImage as String) { item, _ in
      image = item as? UIImage
      semaphore.signal()
    }
  }

  if attachment.hasItemConformingToTypeIdentifier(kUTTypeURL as String) {
    attachment.loadItem(forTypeIdentifier: kUTTypeURL as String) { item, _ in
      url = item as? URL
      semaphore.signal()
    }
  }
}

_ = semaphore.wait(timeout: .now() + 1.0)

print(String(describing: image))
print(String(describing: url))
person Arco    schedule 09.11.2019