忽略SDWebImage的查询参数

时间:2014-09-08 09:26:58

标签: ios caching amazon-s3 sdwebimage

我正在使用SDWebImage在我的应用中缓存图片,但是我最近遇到了一个问题, 缓存的图片会保持刷新状态。调查一下,我发现来自AWS的完整图像网址实际上是由于参数添加到网址末尾而改变的。每次我获取包含图像URL的对象时,图像url返回动态“签名”和“过期”参数(出于安全目的)。就图像缓存而言,它是一个不同的URL,但请注意图像的相同路径。

首先获取:

https://myapp.s3.amazonaws.com/path/image123.jpeg?AWSAccessKeyId=SOMEKEY&Signature=vrUFlMFEQ9fqQ%3D&Expires=1441702633

1秒后再次获取:

https://myapp.s3.amazonaws.com/path/image123.jpeg?AWSAccessKeyId=SOMEKEY&Signature=2mcMxUJLyJd7E%3D&Expires=1441703105

处理这种情况的最佳方法是什么?如果SDWebImage可以选择忽略文件路径之外的查询参数,那肯定会很棒。

5 个答案:

答案 0 :(得分:11)

SDWebImage有一个允许使用自定义密钥的方法,这有助于在这种情况下AWS每次调用时都会更改查询。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary    *)launchOptions
{
    SDWebImageManager.sharedManager.cacheKeyFilter = ^(NSURL *url) {
        url = [[NSURL alloc] initWithScheme:url.scheme host:url.host path:url.path];
        return [url absoluteString];
    };

    // Your app init code...
    return YES;
}

更多阅读:SDWebImage | Using the cache key filter

答案 1 :(得分:6)

@John的回答非常好,但我有时会遇到崩溃。

下面是更稳定的版本。

SDWebImageManager.sharedManager.cacheKeyFilter = ^(NSURL *url) {
    if( [[url absoluteString] isEqualToString:@""] ){
        return @"";
    }
    url = [[NSURL alloc] initWithScheme:url.scheme host:url.host path:url.path];
    return [url absoluteString];
};

此附加代码检查url是否有效。 [[NSURL alloc] initWithString:@""]或类似的东西会导致崩溃。

答案 2 :(得分:6)

Swift语言的答案:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    ...............

    SDWebImageManager.sharedManager().cacheKeyFilter = { url in
        if url.absoluteString == "" {
            return ""
        }

        let newUrl = NSURL(scheme: url.scheme, host: url.host, path: url.path!)!
        return newUrl.absoluteString
    }

    return true
}

答案 3 :(得分:0)

在iOS10中不推荐使用

[NSURL initWithScheme: host: path:]。 应该使用NSURLComponents代替。

我更新的解决方案:

SDWebImageManager.sharedManager.cacheKeyFilter = ^NSString *(NSURL *url) {
     if([[url absoluteString] isEqualToString:@""]){
        return @"";
    }
    NSURLComponents *urlComponents = [[NSURLComponents alloc] initWithURL:url resolvingAgainstBaseURL:NO];
    urlComponents.query = nil;
    return [[urlComponents URL] absoluteString];
};

答案 4 :(得分:0)

iOS 14 ||斯威夫特 5

SDWebImageManager.shared.cacheKeyFilter = SDWebImageCacheKeyFilter { url in
    var components = URLComponents(url: url, resolvingAgainstBaseURL: false)
    components?.query = nil

    print("SDWebImage Cache Key:", components?.url)

    return components?.url?.absoluteString ?? ""
}

因此,在启动时配置 SDWebImageManager,然后每当提供 url 时,它将被剥离其所有查询参数以生成公共缓存键标识符以供 SDWebImage 缓存逻辑工作再次正确。

比如:

<块引用>

https://bucket.s3.us-east-1.amazonaws.com/public/someAsset.ext?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=TILT&X-Amz-Date=20210602T113954Z&X-Amz-Expires=17999&X-Amz-SignedHeaders=host&X-Amz-Security-Token=TILT&X-Amz-Signature=TILT

将有缓存键:

<块引用>

https://bucket.s3.us-east-1.amazonaws.com/public/someAsset.ext


注意:请注意最终网址。如果 url 依赖于其动态输出的查询参数,那么显然您需要修改 SDWebImageCacheKeyFilter 中的逻辑以满足您的要求。