iOS - Swift 3 共享扩展预览图像

6

我目前正在构建一个接受URL的共享扩展程序。作为其中的一部分,我已按照以前的问题中概述的方式自定义了我的共享屏幕,以创建全屏视图控制器。这一切都正常工作。但是在默认的共享composer视图中,我注意到有一个网页的预览图片。我正在尝试在我的扩展程序中访问它,但似乎无法获取它。

具体来说,我一直在尝试使用的方法是

loadPreviewImage

https://developer.apple.com/reference/foundation/nsitemprovider/1403925-loadpreviewimage

您会在文档中看到,完成处理程序的说明如下:
completionHandler 带有结果的完成处理程序块。此块的第一个参数必须是 NSData、NSURL、UIImage(在 iOS 中)或 NSImage(在 macOS 中)类型的参数,以接收图像数据。有关实现该块的更多信息,请参见 Completion​Handler。
然而,如果我尝试将此设置为我的完成块中的 UIImage,则会出现以下错误:
无法将类型'(UIImage,_) -> ()'的值转换为预期的参数类型 'NSItemProvider.CompletionHandler!'
以下是确认 itemProvider 是 NSItemProvider 实例的保护语句的示例代码。
itemProvider.loadPreviewImage(options: nil) { (image: UIImage, error) in    
        }

完成处理程序的文档说要将其设置为所需类型,它会尝试将数据强制转换为您指定的类型。有人见过这种情况吗?我不确定该怎么做,因为我看不出自己哪里做错了。

https://developer.apple.com/reference/foundation/nsitemprovider/completionhandler

如果其他方法都失败了,我会考虑使用一些Javascript从dom中获取图像,但我更喜欢苹果似乎提供的预览图像。
1个回答

3

我不知道为什么代码在

itemProvider.loadPreviewImage(options: nil) { (image: UIImage, error) in    
        }

当点击“Post”按钮时未被调用。

我的解决方案是在方法中保存预览图像。

override func configurationItems() -> [Any]! {
}

as

let inputItem: NSExtensionItem = self.extensionContext?.inputItems[0] as! NSExtensionItem
        let itemProvider = inputItem.attachments![0] as! NSItemProvider
if (itemProvider.hasItemConformingToTypeIdentifier("public.url")) {
            itemProvider.loadPreviewImage(options: nil, completionHandler: { (item, error) in // 画像を取得する
                if let image = item as? UIImage {
                    if let data = UIImagePNGRepresentation(image) {
                        self.photoNSURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false).appendingPathComponent("preview.png") as NSURL!

                        do {
                            try data.write(to: self.photoNSURL as URL, options: .atomic)
                        } catch {
                            print("\(#file)#\(#function)(\(#line)): error: \(error.localizedDescription)")
                        }
                    }
                }
            })
        }

4
对我来说,itemProvider.loadPreviewImage的项目始终为零。 - cdf1982
@cdf1982 你最终弄清楚原因了吗? - user
抱歉,没有 :( - cdf1982

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接