我们可以从 LinkPresentation 框架中的 LPLinkView 中提取图像吗?

Saj*_*obi 6 xcode web-crawler swift api-linkpreview

我想在我的应用程序中显示一个丰富的链接,并将这些数据发送到我的服务器。我需要访问LPLinkView视图内的图像。

如何访问里面的参数?(例如:图像、描述、标题、图标和扩展名...)

URL swift 的 LPLinkView

小智 11

不幸的是,您无法访问 的任何内部属性LPLinkView,但您可以轻松创建自己的视图。该LPLinkMetadata对象拥有您需要的一切,您只需要知道如何从其iconProvider和 中提取图像imageProvider,它们是 的子类NSItemProvider

UIKit (iOS)

您可以使用NSItemProvdierloadObject(ofClass:)方法轻松获取UIImage. 这是有效的,因为UIImage符合NSItemProviderReading协议。

import LinkPresentation
import UIKit

let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))

let url = URL(string: "https://stackoverflow.com/q/61286308/2101447")!

LPMetadataProvider().startFetchingMetadata(for: url) { (linkMetadata, error) in
    guard let linkMetadata = linkMetadata, let imageProvider = linkMetadata.iconProvider else { return }

    print(linkMetadata.title ?? "Untitled")

    imageProvider.loadObject(ofClass: UIImage.self) { (image, error) in
        guard error == nil else {
            // handle error
            return
        }

        if let image = image as? UIImage {
            // do something with image
            DispatchQueue.main.async {
                imageView.image = image
            }
        } else {
            print("no image available")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用户界面

SwiftUIImage是一个struct,所以它不能符合NSItemProviderReading. 最简单的方法是使用上面的 UIKit 代码获取 aUIImage并从中实例化 SwiftUI Image

...

if let uiImage = loadedImage as? UIImage {
    let image = Image(uiImage: uiImage)
}
Run Code Online (Sandbox Code Playgroud)

应用套件 (macOS)

与它的UIImage姐妹不同,NSImage它不符合NSItemProviderReading,这意味着您必须使用NSItemProvdier的旧loadItem(forTypeIdentifier:options:)方法。

你需要指定typeIdentifier并初始化NSImageData自己的,但除此之外,它几乎是相同的。

import CoreServices // may be necessary for kUTTypeImage 
import LinkPresentation
import AppKit

let imageView = NSImageView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))

let url = URL(string: "https://stackoverflow.com/q/61286308/2101447")!

LPMetadataProvider().startFetchingMetadata(for: url) { (linkMetadata, error) in
    guard let linkMetadata = linkMetadata, let imageProvider = linkMetadata.iconProvider else { return }

    print(linkMetadata.title ?? "Untitled")

    imageProvider.loadItem(forTypeIdentifier: kUTTypeImage as String, options: nil) { (data, error) in
        guard error == nil else {
            // handle error
            return
        }
        guard let data = data as? Data else {
            print("no image available")
            return
        }
        if let image = NSImage(data: data) {
            // do something with image
            DispatchQueue.main.async {
                self.imageView.image = image
            }
        } else {
            print("no image available")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)