如何从iOS的Share扩展中的扩展上下文中获取项目?

时间:2015-11-05 08:40:09

标签: ios swift xcode ios8-share-extension

加载我的共享扩展程序后,并非每次都加载,并且不会立即显示所有内容。最常见的是,您可以看到图像,图像数量和内容文本。但是,有些情况会有更多的信息。

  • 如何访问它们?

我知道在SLComposeServiceViewController内有extensionContext及其inputItems属性。

好的,所以我及时停止了调试器,并使用以下命令在控制台上打印出一些内容:

po (extensionContext!.inputItems[0] as! NSExtensionItem).userInfo![NSExtensionItemAttachmentsKey]
  • 这样做是否正确?
  • 通常有一个输入项吗?

有两个NSItemProvider个对象作为第一个NSExtensionItem

的附件

enter image description here

好的,然后我打印出第一个附件:

enter image description here

  • 如何从下一个NSItemProvider和网址获取该图片?您能提供一些代码吗?

我想我们会用

loadItemForTypeIdentifier(_:options:completionHandler:)

但不知道如何。

2 个答案:

答案 0 :(得分:7)

  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
    
                        })
                    }
                }
            }
        }
    }
    

答案 1 :(得分:0)

因此,现在您知道了使用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))