如何在iOS Swift项目中使用Soto通过SPM调用AWS API Gateway服务
iOS 基于Soto + Swift Package Manager 复刻Android端AWS API调用实现
集成准备
- 在Xcode内通过SPM添加Soto依赖包时,仅勾选
SotoCore基础组件即可,无需引入全量AWS服务SDK,大幅减少包体积 - 网络参数完全对齐Android端配置,将连接超时、请求超时统一设置为30s
数据模型定义
完全对齐Android端的字段结构,遵循Swift Codable协议实现序列化逻辑:
// 对应Android端的ApiDemoModel struct ApiDemoModel: Codable { let code: String } // 对应Android端接口返回的RetourStatutWS,按实际返回字段填充即可 struct RetourStatutWS: Codable {}
客户端持有类实现
对齐Android端的AWSInterfaceHolder逻辑,单例持有网络客户端,对接你已接入的AWSMobileClient凭证源:
import SotoCore class AWSInterfaceHolder { static let shared = AWSInterfaceHolder() let awsClient: AWSClient private init() { // 适配AWSMobileClient的凭证来源,转换为Soto可识别的凭证格式 let credentialProvider = AWSMobileClientAdapter() // 对齐Android端30s超时配置 let clientConfig = AWSClientConfiguration( connectTimeout: .seconds(30), requestTimeout: .seconds(30) ) // 绑定你API Gateway的固定服务端点 let serviceEndpoint = "https://abcde12345.execute-api.eu-central-1.amazonaws.com/dev" self.awsClient = AWSClient( credentialProvider: credentialProvider, config: clientConfig, endpoint: serviceEndpoint ) } }
接口调用实现
完全复刻Android端的接口定义,向指定路径发送POST请求,携带对应请求头和请求体:
func callApiDemo(code: String) async throws -> RetourStatutWS { let client = AWSInterfaceHolder.shared.awsClient // 构造与Android端一致的请求体 let requestBody = ApiDemoModel(code: code) return try await client.execute( method: .POST, path: "/api-demo", headers: ["Content-Type": "application/json"], body: .json(requestBody), output: .json(RetourStatutWS.self) ) }
初始化流程
保留你原有的AWSMobileClient初始化逻辑,等待初始化成功拿到有效凭证后再发起接口请求,和Android端逻辑完全一致:
// 原有AWSMobileClient初始化逻辑不变 AWSMobileClient.default().initialize { userState, error in if let error = error { // 初始化失败处理,对齐Android端onError逻辑 print("初始化失败: \(error.localizedDescription)") return } // 初始化成功后发起调用 Task { do { let response = try await callApiDemo(code: "123456") // 处理返回结果 } catch { // 处理请求异常 } } }
注意事项
- 自动签名:Soto会自动按照AWS SigV4规则为请求添加签名头,和Android端SDK的自动加签逻辑完全一致,无需手动实现签名逻辑
- 凭证适配:Soto对接AWSMobileClient时仅需写少量适配代码,把AWSMobileClient返回的临时凭证(访问密钥ID、秘密访问密钥、会话令牌)传入Soto的
StaticCredentialProvider即可,不需要改动原有AWSMobileClient的认证逻辑 - 序列化兼容:两端均采用JSON序列化,只要模型字段、层级完全对齐,不会出现格式不匹配问题
- 资源释放:App终止时调用
AWSInterfaceHolder.shared.awsClient.syncShutdown()释放网络资源,避免内存泄漏
内容的提问来源于stack exchange,提问作者matteoh
相关产品推荐
相关产品推荐

