iOS:下载 AWS S3 图像并将其缓存以备将来使用

标签 ios swift amazon-web-services amazon-s3 sdwebimage

从早上开始,我一直在努力尝试从 Amazon S3 存储桶下载图像(webp 图像)并缓存它。无论我采取何种方法,我都遇到了一些障碍。我尝试以不同的方式实现这一目标,

  1. 子类化 NSURLProtocol 并使用 SDWebImage 检索图像,如博文中所示 here .这种方法的问题是,子类协议(protocol)的 canInitWithRequest 方法永远不会被调用,即使我已经注册了我的子类 NSURLProtocol 类。
  2. 计划直接使用 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/

相关文章:

swift - 如何从Vuforia GL矩阵计算相机位置?

iphone - MKMapview 显示当前位置错误

ios - 一组动画完成后切换到不同 View

xcode - 向 objective-c 库添加桥接头会破坏所有框架符号

swift - 文本字段 - 标签 - 按钮 根据输入回答

amazon-web-services - 使用 AWS WAF 阻止 IP,以便只有连接到 VPN 的用户才能访问 CloudFront

node.js - Elastic Beanstalk 部署失败、权限被拒绝、mkdir

amazon-ec2 - 我应该如何处理我的 EC2 应急计划?

ios - 抓取从 UIImagePickerController 保存的图像?

ios - 将 base64string 发送到服务器但服务器获取损坏的数据