从早上开始,我一直在努力尝试从 Amazon S3 存储桶下载图像(webp 图像)并缓存它。无论我采取何种方法,我都遇到了一些障碍。我尝试以不同的方式实现这一目标,
- 子类化 NSURLProtocol 并使用 SDWebImage 检索图像,如博文中所示 here .这种方法的问题是,子类协议(protocol)的 canInitWithRequest 方法永远不会被调用,即使我已经注册了我的子类 NSURLProtocol 类。
- 计划直接使用 SDWebImage 和其他库,但我们不能这样做,因为没有规定在 SDWebImage 中设置授权 header ,即使我们尝试设置它也很困难,SDWebImage 会在创建 NSMutableURLRequest 时忽略它下载。
所以现在我只能选择使用 Amazon SDK 下载图像,然后使用 SDWebImage 的 SDImageCache 独立缓存它,或者我需要将 SDWebImage 源代码添加到我的项目中,然后我需要修改它是获取授权 header 的来源。
如果有任何更好的方法来实现这一点,请告诉我,如果我能就什么是实现我想要做的事情的最佳方法提供一些指示,那就太好了。
提前致谢。
最佳答案
您可以选择 Kingfisher 用于缓存的 key 。因此,创建一个预签名的 s3 url,然后在加载图像时使用您的 s3 key 作为缓存,而不是完整的预签名 url。
let getPreSignedURLRequest = AWSS3GetPreSignedURLRequest()
getPreSignedURLRequest.bucket = media.bucket
getPreSignedURLRequest.key = media.key
getPreSignedURLRequest.httpMethod = .GET
getPreSignedURLRequest.expires = Date(timeIntervalSinceNow: 3600) // Change the value of the expires time interval as required
AWSS3PreSignedURLBuilder.default().getPreSignedURL(getPreSignedURLRequest).continueWith { (task:AWSTask<NSURL>) -> Any? in
if let error = task.error as NSError? {
print("Error: \(error)")
return nil
}
if let presignedURL = task.result {
DispatchQueue.main.async {
self.imageView.kf.indicatorType = .activity
let resource = ImageResource(downloadURL: URL(string: presignedURL.absoluteString!)!, cacheKey: media.key)
self.imageView.kf.setImage(with: resource)
}
}
return nil
}
关于iOS:下载 AWS S3 图像并将其缓存以备将来使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37835510/