在 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