在 Swift (iOS/macOS) 中处理 S3 和云存储:AWSS3 和 Amplify

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在 Swift (iOS/macOS) 中处理 S3 和云存储



在现代 Swift 移动和桌面应用程序开发中,经常需要存储和传输大量数据:图像、视频、用户文档。Amazon S3(简单存储服务)是解决这些任务最流行的云解决方案之一。在本文中,我们将介绍如何使用 Amazon 官方 SDK——AWSS3 将 S3 集成到 iOS 和 macOS 的 Swift 应用程序中,并探讨通过 Amplify 框架实现的更高级方法。



为什么 Swift 应用程序需要 S3?

S3 提供可扩展、安全且低成本的对象存储。在 Swift 中使用 S3 可以:

  • 将文件存储负载从设备卸载到云端。
  • 确保用户可以从任何设备访问数据。
  • 使用内置的加密和访问控制机制。
  • 与其他 AWS 服务(Lambda、Cognito、CloudFront)集成。


环境配置

开始之前需要:

  • AWS 账户和已创建的 S3 存储桶。
  • Xcode 14+ 和 Swift 项目(iOS 15+ / macOS 12+)。
  • 通过 Swift Package Manager (SPM) 安装依赖项。


通过 SPM 安装 AWSS3

在 Package.swift 或通过 Xcode 界面添加包:

// File → Add Packages → 搜索:https://github.com/aws-amplify/aws-sdk-ios-spm// 在产品列表中选择 "AWSS3"。

在代码中导入库:

import AWSS3


基本示例:上传文件到 S3

考虑一个最简单的场景——从用户相册上传图像。身份验证使用 Cognito Identity Pool,但在测试模式下可以直接传递密钥(不推荐用于生产环境)。



服务配置

let credentialsProvider = AWSStaticCredentialsProvider(    accessKey: "YOUR_ACCESS_KEY",    secretKey: "YOUR_SECRET_KEY")let configuration = AWSServiceConfiguration(    region: .USEast1,    credentialsProvider: credentialsProvider)AWSServiceManager.default().defaultServiceConfiguration = configuration


上传文件 (upload)

func uploadImageToS3(imageData: Data, bucketName: String, key: String) {    let request = AWSS3TransferManagerUploadRequest()!    request.bucket = bucketName    request.key = key    request.body = imageData    request.contentLength = Int64(imageData.count)

let transferManager = AWSS3TransferManager.default() transferManager?.upload(request).continueWith { task -> Any? in if let error = task.error { print("上传错误:\\(error.localizedDescription)") } else { print("文件上传成功:\\(bucketName)/\\(key)") } return nil }}


下载文件 (download)

func downloadFromS3(bucketName: String, key: String, localURL: URL) {    let request = AWSS3TransferManagerDownloadRequest()!    request.bucket = bucketName    request.key = key    request.downloadingFileURL = localURL

let transferManager = AWSS3TransferManager.default() transferManager?.download(request).continueWith { task -> Any? in if let error = task.error { print("下载错误:\\(error.localizedDescription)") } else { print("文件已保存到 \\(localURL.path)") } return nil }}


使用 Amplify Storage 处理 S3

Amplify 提供了更简单的 API,隐藏了与 S3 交互的细节。它需要通过 CLI 或 amplifyconfiguration.json 文件进行预先配置。



安装 Amplify

// 添加包:https://github.com/aws-ampl                    

推荐