在 Swift (iOS/macOS) 中操作 S3 和云存储:AWSS3 库

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

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

开始课程

在 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——这是最现代的方式。



  1. 打开 Xcode,进入 File → Add Packages...
  2. 输入仓库 URL:https://github.com/awslabs/aws-sdk-swift.git
  3. 选择 AWSS3 包并指定版本(建议使用最新的稳定版本)。
  4. 将包添加到目标 target。


安装后,在将要进行存储操作的文件中导入模块:



import AWSS3


S3 客户端配置



要连接到兼容 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 方法返回存储桶中的键(文件名)列表:




                
    
    

推荐