You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Amplify-Swift SDK访问Lambda模块并解决依赖冲突?

解决Swift包中Amplify与AWS SDK依赖冲突及Lambda/Cognito访问问题

你的问题核心是重复依赖冲突:amplify-swift本身已经内置了aws-sdk-swift相关组件,额外引入aws-sdk-ios-spm会导致模块重复。下面是具体解决方案,分两种场景给出:


方案1:优先使用Amplify官方插件(推荐)

Amplify提供了Cognito认证和Lambda调用的专属插件,无需直接引入底层AWS SDK,既能避免依赖冲突,又能利用Amplify的便捷封装。

步骤1:清理重复依赖

修改Package.swift的dependencies,移除aws-sdk-ios-spm,只保留amplify-swift:

dependencies: [
    .package(url: "https://github.com/aws-amplify/amplify-swift.git", from: "2.6.0"),
],

步骤2:引入所需插件

在target的依赖中添加Amplify核心库以及Cognito、Lambda插件:

.target(
    name: "YourPackageTarget", // 替换为你的包目标名称
    dependencies: [
        .product(name: "Amplify", package: "amplify-swift"),
        .product(name: "AWSCognitoAuthPlugin", package: "amplify-swift"),
        .product(name: "AWSLambdaPlugin", package: "amplify-swift")
    ]
),

步骤3:初始化Amplify并调用服务

在代码中配置Amplify,然后通过插件访问Cognito和Lambda:

import Amplify
import AWSCognitoAuthPlugin
import AWSLambdaPlugin

// 初始化Amplify
func configureAmplify() {
    do {
        try Amplify.add(plugin: AWSCognitoAuthPlugin())
        try Amplify.add(plugin: AWSLambdaPlugin())
        try Amplify.configure()
    } catch {
        fatalError("Amplify配置失败: \(error)")
    }
}

// 调用Lambda函数
func invokeLambda(functionName: String, payload: [String: Any]) async throws {
    let request = LambdaInvokeRequest(functionName: functionName, payload: payload)
    let result = try await Amplify.Lambda.invoke(request: request)
    
    // 处理返回结果
    if let payloadData = result.payload {
        let response = try JSONSerialization.jsonObject(with: payloadData) as? [String: Any]
        print("Lambda返回结果: \(response ?? [:])")
    }
}

方案2:直接调用底层AWS SDK(特殊场景)

如果Amplify插件无法满足你的定制化需求,可直接使用amplify-swift内置的aws-sdk-swift模块,无需额外引入其他SDK包。

步骤1:保留Amplify依赖并添加SDK模块

修改Package.swift的target依赖,直接引入所需的AWS SDK组件:

.target(
    name: "YourPackageTarget",
    dependencies: [
        .product(name: "Amplify", package: "amplify-swift"),
        .product(name: "AWSCognitoIdentityProvider", package: "aws-sdk-swift"),
        .product(name: "AWSLambda", package: "aws-sdk-swift")
    ]
),

步骤2:获取凭证并调用SDK

利用Amplify Auth管理的凭证,初始化AWS客户端并调用服务:

import Amplify
import AWSLambda

func directInvokeLambda(functionName: String, region: String = "us-east-1") async throws {
    // 从Amplify获取当前用户的认证凭证
    guard let credentials = try await Amplify.Auth.fetchAuthSession() as? AuthAWSCredentials,
          let accessKey = credentials.accessKey,
          let secretKey = credentials.secretKey,
          let sessionToken = credentials.sessionToken else {
        throw NSError(domain: "AuthError", code: -1, userInfo: [NSLocalizedDescriptionKey: "无法获取认证凭证"])
    }
    
    // 初始化Lambda客户端
    let lambdaClient = try LambdaClient(
        region: Region(rawValue: region),
        credentialsProvider: .static(accessKeyId: accessKey, secretAccessKey: secretKey, sessionToken: sessionToken)
    )
    
    // 构造请求并调用
    let input = InvokeInput(
        functionName: functionName,
        payload: "{\"param\": \"value\"}".data(using: .utf8)
    )
    let output = try await lambdaClient.invoke(input: input)
    
    // 解析返回结果
    if let payloadData = output.payload, let responseString = String(data: payloadData, encoding: .utf8) {
        print("Lambda直接调用结果: \(responseString)")
    }
}

关键提示

  • 永远不要同时引入amplify-swift和单独的AWS SDK包(如aws-sdk-ios-spm),避免依赖冲突。
  • 优先使用Amplify插件,它提供了更简洁的API和统一的生命周期管理,减少自定义代码量。

内容的提问来源于stack exchange,提问作者Neo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 09:37:50