SDWebImageLinkPlugin

CI Status Version License Platform Carthage compatible SwiftPM compatible codecov

功能介绍

SDWebImageLinkPlugin 是 SDWebImage 框架的一个插件,它通过使用 iOS 13/macOS 10.15 中引入的 Link Presentation 框架,为富链接 URL 提供图像加载支持。

通过使用此插件,您可以使用 SDWebImage 中您熟悉的 View Category 方法,通过 URL 或 LPLinkMetadata 加载富链接的预览图。并使其易于将 LPLinkView 与缓存支持一起使用。

请在 WWDC 262: Embedding and Sharing Visually Rich Links 中查看更多关于 Link Presentation 的信息

系统要求

安装

CocoaPods

SDWebImageLinkPlugin 可以通过 CocoaPods 获取。要安装它,只需将以下行添加到您的 Podfile 中

pod 'SDWebImageLinkPlugin'

Carthage

SDWebImageLinkPlugin 可以通过 Carthage 获取。

github "SDWebImage/SDWebImageLinkPlugin"

Swift Package Manager (Xcode 11+)

SDWebImageLinkPlugin 可以通过 Swift Package Manager 获取。

let package = Package(
    dependencies: [
        .package(url: "https://github.com/SDWebImage/SDWebImageLinkPlugin.git", from: "0.1")
    ]
)

用法

设置加载器

要使用 LinkPlugin,您应该首先设置加载器。 请在此处查看更多信息:Wiki - Loaders Manager

// Put this code on AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    [SDImageLoadersManager.sharedManager addLoader:SDImageLinkLoader.sharedLoader];
    SDWebImageManager.defaultImageLoader = SDImageLoadersManager.sharedManager;
    return YES;
}

在 UIImageView 上加载富链接

简单快捷的用法是使用 SDWebImage 在 UIImageView 上提供的 category。

NSURL *url = [NSURL URLWithString:@"https://webkit.ac.cn/"];
self.imageView = [[UIImageView alloc] init];
self.imageView.contentMode = UIViewContentModeScaleAspectFit;
[self.view addSubview:self.imageView];
[self.imageView sd_setImageWithURL:url completed:^(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL) {
    if (image && [image.sd_extendedObject isKindOfClass:LPLinkMetadata.class]) {
        NSLog(@"%@", @"UIImageView metadata load success");
    }
}];

在 LPLinkView 上加载富链接

关于 LPLinkView 的重要提示:当前的 iOS 13.0 包含一个 bug,即 LPLinkView 可能与 TableView/CollectionView 的 cell 重用不兼容。 为了解决这个问题,您可以选择以下方法之一(选择一个即可)

  1. 完全不使用缓存。 因此,始终传递 SDWebImageFromLoaderOnly 以从网络加载元数据
  2. 使用技巧代码,使用空的 LPLinkMetadata 或 nil URL (重要) 创建 LPLinkView
NSURL *url = [NSURL URLWithString:@"https://www.apple.com/iphone/"];
self.linkView = [[LPLinkView alloc] initWithURL:nil];
[self.view addSubview:self.linkView];
[self.linkView sd_setImageWithURL:url completed:^(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL) {
    if (image && [image.sd_extendedObject isKindOfClass:LPLinkMetadata.class]) {
        NSLog(@"%@", @"LPLinkView metadata load success");
    }
}];

使用 LPLinkMetadata

在某些情况下,如果您有预先获取或预先创建的 LPLinkMetadata 对象,则可以使用 SDWebImageContextLinkMetadata 上下文选项将其关联,而无需向原始链接 URL 发送额外的请求。 但在大多数情况下,您不需要这样做,只需使用指向富链接的 NSURL,我们将使用 LPMetadataProvider 查询 LPLinkMetadata

请记住,如果您不想要双重缓存(LPLinkMetadata 归档文件也将包含图像数据,但不是简单的图像 URL),请不要使用 NSCoding 方法将回调 image.sd_extendedObject 中的元数据同步或缓存到您自己的存储中。 让框架来完成这件事。

// Decoding a metadata from your serialization solution
LPLinkMetadata *metadata = [NSKeyedUnarchiver unarchiveObjectWithFile:@"/path/to/metadata"];
// Load image without query metadata again
[imageView sd_setImageWithURL:metadata.originalURL placeholderImage:nil options:0 context:@{SDWebImageContextLinkMetadata : metadata}];

注意:默认情况下,如果图像已缓存,我们不会发送请求来查询新的元数据。 如果您也需要查询元数据,请考虑使用 SDWebImage 的 SDWebImageRefreshCached 选项。 或者使用 SDWebImageFromLoaderOnly 以避免在查询期间使用缓存。

注意:默认情况下,我们倾向于仅加载图像,这不会生成图像数据。 这可以提高加载速度。 但是,您也可以通过使用 SDWebImageContextLinkRequestImageData 上下文选项来指定生成图像数据。

向后兼容

从 v0.3.0 版本开始,此框架支持在 iOS 12-/macOS 10.14- 版本上向后部署。 向后部署仅支持 Carthage/CocoaPods(SwiftPM 不支持)。

对于 CocoaPods 用户,您可以在 Podfile 中跳过平台版本验证,使用:

platform :ios, '13.0' # This does not effect your App Target's deployment target version, just a hint for CocoaPods

对于 Carthage 用户,构建的二进制框架使用弱链接进行向后部署。

请注意,您应该始终使用运行时版本检查来确保这些符号可用,您应该使用 API_AVAILABLE 注解标记所有使用公共 API 的类。 见下文:

if (@available(iOS 13, *)) {
    SDImageLinkLoader.sharedLoader.timeout = 60;
}

API_AVAILABLE(ios(13.0))
@interface MyLinkManager : NSObject
@property (nonatomic) LPLinkMetadata *metadata;
@property (nonatomic) SDImageLinkLoader *loader;
@end

示例

如果您在使用方面有任何问题,SDWebImageLinkPlugin 为 iOS && macOS 平台提供了一个示例。 要运行示例,请克隆 repo 并运行以下命令。

cd Example/
pod install
open SDWebImageLinkPlugin.xcworkspace

在 Xcode 项目打开后,点击 “Run” 来构建并运行示例。

提示:iOS 示例提供了两种视图的用法。 点击 “Switch View” 可以在 UIImageView/LPLinkView 之间切换。

截图

这些富链接图像来自 Apple 网站WebKit 网站

作者

DreamPiggy

许可证

SDWebImageLinkPlugin 在 MIT 许可证下可用。 有关更多信息,请参见 LICENSE 文件。