在 Swift (iOS/macOS) 中操作 S3 和云存储
在现代 iOS 和 macOS 开发中,经常需要集成兼容 Amazon S3(简单存储服务)协议的云存储。这可以是官方的 AWS S3,也可以是自托管的解决方案,如 MinIO 或 DigitalOcean Spaces。对于 Swift,有一个强大的工具——来自 AWS SDK for Swift 的 AWSS3 库,它允许您轻松管理存储桶中的对象:上传、下载、删除和获取元数据。
在本文中,我们将介绍如何在项目中配置 AWSS3,执行基本的文件操作以及处理可能的错误。本材料适用于使用 Swift 5.7+ 编写的 iOS 和 macOS 应用程序。
安装和配置 AWSS3
要使用 AWSS3,需要通过 Swift Package Manager (SPM) 或 CocoaPods 添加依赖项。我们来看 SPM——这是最现代的方式。
- 打开 Xcode,进入
File → Add Packages... - 输入仓库 URL:
https://github.com/awslabs/aws-sdk-swift.git - 选择
AWSS3包并指定版本(建议使用最新的稳定版本)。 - 将包添加到目标 target。
安装后,在将要进行存储操作的文件中导入模块:
import AWSS3S3 客户端配置
要连接到兼容 S3 的存储,需要使用凭证(Access Key、Secret Key)和 endpoint 创建配置。对于 AWS S3,可以省略 endpoint——SDK 会自动确定区域。对于 MinIO 或其他服务,endpoint 是必需的。
// MinIO(本地服务器)的配置示例let endpoint = "http://localhost:9000"let accessKey = "YOUR_ACCESS_KEY"let secretKey = "YOUR_SECRET_KEY"
let credentials = AWSCredentials(accessKey: accessKey, secretAccessKey: secretKey)let region = AWSRegion.useast1 // 或其他区域
let configuration = AWSS3Configuration( region: region, endpoint: endpoint, credentialsProvider: .static(credentials), useFIPS: false, useDualStack: false)
let s3Client = try await AWSS3Client(configuration: configuration)对于 AWS S3,配置更简单——只需指定区域并从 IAM 角色或环境变量获取凭证:
let configuration = AWSS3Configuration( region: .useast1, credentialsProvider: .default)let s3Client = try await AWSS3Client(configuration: configuration)S3 对象的基本操作
1. 上传文件 (Upload)
要将数据上传到存储桶,请使用 putObject 方法。数据可以是 Data、String 或流。
func uploadFile(bucket: String, key: String, data: Data) async throws { let putObjectInput = PutObjectInput( body: .data(data), bucket: bucket, key: key ) let response = try await s3Client.putObject(input: putObjectInput) print("文件已上传。ETag: \\(response.eTag ?? "未知")")}2. 下载文件 (Download)
要获取对象,请使用 getObject:
func downloadFile(bucket: String, key: String) async throws -> Data { let getObjectInput = GetObjectInput( bucket: bucket, key: key ) let response = try await s3Client.getObject(input: getObjectInput) guard let body = response.body else { throw NSError(domain: "S3Error", code: -1, userInfo: [NSLocalizedDescriptionKey: "响应体为空"]) } let data = try await body.readData() return data}3. 获取存储桶中的对象列表
listObjectsV2 方法返回存储桶中的键(文件名)列表:
图书馆中也有
推荐