在Swift中配置AWSS3 SDK静态凭证并列出AWS存储桶对象
解决AWS SDK Swift静态凭证创建S3Client及列出桶对象问题
错误原因分析
你遇到的Cannot find 'accessKeyId' in scope错误,是因为AWS SDK Swift(基于AWSClientRuntime的版本)不支持直接用字典字面量传入凭证,必须通过官方提供的StaticCredentialsProvider构造静态凭证,再传入客户端配置。
正确实现代码
以下是完整的静态凭证初始化S3Client,并列出存储桶对象及元数据的代码:
import Foundation import AWSS3 import AWSClientRuntime func testAWSListBucketObjects() async throws { // 1. 构造静态凭证提供者 let credentials = StaticCredentialsProvider( accessKeyId: "你的AWS访问密钥ID", secretAccessKey: "你的AWS秘密访问密钥" ) // 2. 构造S3客户端配置 let config = S3ClientConfiguration( region: "eu-west-2", credentialsProvider: credentials ) // 3. 初始化S3Client let client = S3Client(config: config) // 4. 构造列出对象的请求 let listRequest = ListObjectsV2Input( bucket: "你的存储桶名称" ) // 5. 发送请求并处理响应 let response = try await client.listObjectsV2(input: listRequest) // 6. 遍历对象并打印元数据 if let contents = response.contents { for object in contents { print("对象键: \(object.key ?? "无键名")") print("大小: \(object.size ?? 0) 字节") print("最后修改时间: \(object.lastModified ?? Date.distantPast)") print("ETag: \(object.eTag ?? "无ETag")") print("存储类别: \(object.storageClass?.rawValue ?? "未知类别")") print("---") } } } // 调用测试(需在异步上下文执行,比如SwiftUI的.task或ViewController的viewDidLoad里用Task) // Task { // do { // try await testAWSListBucketObjects() // } catch { // print("错误: \(error)") // } // }
关键注意事项
- 版本兼容性:确保
AWSS3和AWSClientRuntime版本一致,避免多版本冲突。可在Package.swift里锁定版本:dependencies: [ .package(url: "https://github.com/awslabs/aws-sdk-swift", from: "1.0.0"), ], targets: [ .target( name: "你的Target名称", dependencies: [ .product(name: "AWSS3", package: "aws-sdk-swift"), .product(name: "AWSClientRuntime", package: "aws-sdk-swift"), ] ), ] - 异步调用:AWS SDK Swift的所有API都是异步的,必须在
async函数中通过await调用,不能在同步上下文直接执行。 - 权限配置:确保静态凭证拥有
s3:ListBucket权限,否则会返回权限错误。
内容的提问来源于stack exchange,提问作者bgarrood
相关产品推荐
相关产品推荐

