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 的信息
SDWebImageLinkPlugin 可以通过 CocoaPods 获取。要安装它,只需将以下行添加到您的 Podfile 中
pod 'SDWebImageLinkPlugin'
SDWebImageLinkPlugin 可以通过 Carthage 获取。
github "SDWebImage/SDWebImageLinkPlugin"
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;
}
简单快捷的用法是使用 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
的重要提示:当前的 iOS 13.0 包含一个 bug,即 LPLinkView
可能与 TableView/CollectionView 的 cell 重用不兼容。 为了解决这个问题,您可以选择以下方法之一(选择一个即可)
SDWebImageFromLoaderOnly
以从网络加载元数据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
对象,则可以使用 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 文件。