加载我的共享扩展程序后,并非每次都加载,并且不会立即显示所有内容。最常见的是,您可以看到图像,图像数量和内容文本。但是,有些情况会有更多的信息。
我知道在SLComposeServiceViewController
内有extensionContext
及其inputItems
属性。
好的,所以我及时停止了调试器,并使用以下命令在控制台上打印出一些内容:
po (extensionContext!.inputItems[0] as! NSExtensionItem).userInfo![NSExtensionItemAttachmentsKey]
有两个NSItemProvider
个对象作为第一个NSExtensionItem
好的,然后我打印出第一个附件:
NSItemProvider
和网址获取该图片?您能提供一些代码吗?我想我们会用
loadItemForTypeIdentifier(_:options:completionHandler:)
但不知道如何。
答案 0 :(得分:7)
import MobileCoreServices
您可以将一个简单的功能应用于您的代码:
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))