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

时间:2017-04-02 20:37:56

标签: ios swift ios-extensions

我目前正在构建一个接受网址的共享扩展程序。作为其中的一部分,我已经按照上一个问题中的概述定制了我的共享屏幕,以创建全屏视图控制器。这一切都很好。但是在默认共享编辑器视图中,我注意到有一个网页的预览图像。我试图在我的扩展程序中访问它,但我似乎无法掌握它。

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

loadPreviewImage

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

您将在文档中注明,这表示完成处理程序的以下内容

  

完成处理程序   一个完成处理程序块,用于执行结果。该块的第一个参数必须是NSData,NSURL,UIImage(在iOS中)或NSImage(在macOS中)类型的参数,用于接收图像数据。有关实现块的更多信息,请参阅完成处理程序。

但是如果我尝试在完成块中将其设置为UIImage,则会出现错误

  

无法转换类型的值'(UIImage,_) - > ()'到预期的论点   输入'NSItemProvider.CompletionHandler!'

示例代码,其中itemProvider通过保护语句被确认为NSItemProvider的实例

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

完成处理程序的文档说要将其设置为您想要的类型,它将尝试将数据强制转换为您指定的类型。谁看过这个吗?我不知道该怎么做,因为我看不出我做错了什么。

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

如果所有其他方法都失败了,我会考虑使用一些Javascript从dom中获取图像,但我会喜欢Apple似乎提供的预览图像

1 个答案:

答案 0 :(得分:3)

我不知道为什么

中的代码
itemProvider.loadPreviewImage(options: nil) { (image: UIImage, error) in    
        }

在点按“发布”按钮时未调用。

我的方法是在方法

中保存预览图像
override func configurationItems() -> [Any]! {
}

作为

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