You need to enable JavaScript to run this app. 如何在iOS Swift项目中使用Soto通过SPM调用AWS API Gateway服务
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.06 11:27:03