【问题标题】:iOS: Downloading the AWS S3 images & cache it for future useiOS:下载 AWS S3 映像并将其缓存以供将来使用
【发布时间】:2019-02-08 03:04:31
【问题描述】:

我一直在尝试从 Amazon S3 存储桶下载图像(webp 图像)并缓存它。无论我采取什么方法,我都遇到了一些或其他的障碍。我尝试了不同的方式来实现这一点,

  1. 继承 NSURLProtocol 并使用 SDWebImage 检索图像,如博客文章 here 中所示。这种方法的问题在于,子类协议的 canInitWithRequest 方法永远不会被调用,即使我已经注册了我的子类 NSURLProtocol 类。
  2. 计划直接使用 SDWebImage 和其他库,但我们不能这样做,因为没有规定在 SDWebImage 中设置 Authorization 标头,即使我们尝试设置它也很困难,SDWebImage 将在创建 NSMutableURLRequest 时忽略它下载。

所以现在我可以选择使用 Amazon SDK 下载图像,然后使用 SDWebImage 的 SDImageCache 独立缓存它,或者我需要将 SDWebImage 源代码添加到我的项目中,然后我需要修改它是获取授权标头的来源。

如果有更好的方法来实现这一点,请告诉我,如果我能提供一些关于实现我想要做的最好方法的指示,那就太好了。

提前致谢。

【问题讨论】:

  • 您可以使用适用于 iOS 的 AWS 开发工具包或尝试使用 AWS Mobile Hub aws.amazon.com/mobile
  • @RohanDubal 是的,我可以使用 AWS 开发工具包,但问题是它不支持开箱即用的缓存,这是我主要关心的问题。
  • 您可以使用 Mobile Hub 并启用用户文件/内容交付功能,该功能会下载文件并将其存储在缓存中,以便您可以随时在应用程序中本地打开它们。具体用例是什么?上述功能是否满足您的用例?
  • 我的用例是,我必须让我的应用程序离线工作。我必须获取项目列表的图像,并且必须将它们缓存在应用程序中。这样当用户没有连接到互联网时,他/她将能够看到图像。不知道Mobile Hub会不会来看看。
  • 移动集线器应用程序应该适合您的用例。一定要试一试!

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


【解决方案1】:

您可以选择 Kingfisher 用于缓存的密钥。因此,创建一个预签名的 s3 url,然后在加载图像时使用您的 s3 密钥作为缓存,而不是完整的预签名 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
            }

【讨论】:

  • Answer 看起来不错,但是当您为列表(即 Table 或 collectionView)下载图像时,感觉并不好。
【解决方案2】:

说实话,我自己研究了很长时间,对 AWS 提供的内置缓存系统并不满意。相反,我选择使用 Kingfisher https://github.com/onevcat/Kingfisher,因为它内置 swift 并且使用良好。我强烈推荐它,因为它是高度可定制的,而且“开箱即用”也能完美运行

【讨论】:

  • 嗨 Garrett,我在其他项目中使用了 kingfisher。但问题是我不能开箱即用地使用 KF 来完成这项任务。我必须调整使用 KF 下载图像的方式。例如,如果我对 S3 使用 REST 身份验证,我需要能够发送 KF 不支持的授权标头。如果我使用 Amazon SDK 下载图像,那么我不会使用 KF 下载图像,我只会使用它来缓存使用 Amazon SDK 下载的图像。
  • 另外请告诉我您是如何使用 KF 从 S3 下载图像的。您是否只是将 KF 的缓存用于下载的图像,或者您是否能够使用 KF 发送身份验证标头,或者您是否遵循了任何方法:)。这对我有很大帮助。谢谢
  • @iamyogish 好问题,在我的情况下,我也能够使用 KF 下载图像。这是因为我公开了我的图像。我知道这并非适用于所有情况。根据 KF 文档,您可以使用 NSMutableURLRequest 在下载请求中构建您需要的 auth 标头,然后将 sur 保留在末尾以避免 [link]stackoverflow.com/questions/18885587/…
猜你喜欢
  • 2012-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-25
  • 1970-01-01
  • 2014-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多