SDWebImageLinkPlugin 0.3.0

SDWebImageLinkPlugin 0.3.0

DreamPiggy 维护。



  • DreamPiggy

SDWebImageLinkPlugin

CI Status Version License Platform Carthage compatible SwiftPM compatible codecov

适用场景

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

通过使用此插件,您可以使用 SDWebImage 中的熟悉的 View Category 方法来加载丰富链接的海报图像,使用 URL 或 LPLinkMetadata。这使得使用具有缓存支持的 LPLinkView 更加方便。

有关更多信息,请参阅 WWDC 262:嵌入和共享视觉丰富的链接

要求

  • iOS 13+
  • macOS 10.15+
  • Xcode 11+

安装

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

  • Objective-C
// 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 提供的分类。

  • Objective-C
NSURL *url = [NSURL URLWithString:@"https://webkit.org/"];
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 存在问题,LPLinkView 可能与 TableView/CollectionView cell-reusing 不兼容。要解决这个问题,您可以选择以下方法之一(任选其一)

  1. 完全不使用缓存。因此,始终传递 SDWebImageFromLoaderOnly 从网络加载元数据
  2. 使用技巧代码,使用空的 LPLinkMetadata 或 nil URL 创建 LPLinkView(非常重要)。
  • Objective-C
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 同步或缓存元数据到您的存储。让框架来处理这件事。

  • Objective-C
// 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 平台提供了一个示例。要运行示例,请克隆存储库并运行以下命令。

cd Example/
pod install
open SDWebImageLinkPlugin.xcworkspace

打开 Xcode 项目后,点击 Run 编译和运行示例。

提示:iOS 示例提供了两种视图的使用。点击 切换视图 在 UIImageView/LPLinkView 之间切换。

截图

这些丰富的链接图片来自 Apple 网站WebKit 网站.

作者

DreamPiggy

许可

SDWebImageLinkPlugin 以 MIT 许可协议提供。更多信息请查看 LICENSE 文件。