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

使用Amplify Auth遇Extra trailing closure错误,求纯Amplify解决方案

解决Amplify Auth调用signIn/resetPassword时的"Extra trailing closure passed in call"错误

你遇到的错误是因为Amplify Swift SDK v2+版本已全面切换到Swift async/await异步模型,移除了旧版本支持的闭包回调参数,你原来的代码是基于旧版本SDK的闭包写法,因此编译器判定你传递了多余的尾随闭包。

解决方案一:使用async/await重构(推荐,符合现代Swift异步规范)

直接将认证方法改为async/await风格,这是Amplify v2+推荐的用法:

import Amplify

class Auth {
    var email: String?
    var password: String?

    // 登录 - async/await版本
    func login(email: String, password: String) async throws -> String {
        let signInResult = try await Amplify.Auth.signIn(username: email, password: password)
        guard signInResult.isSignedIn else {
            throw AuthError.loginFailed("登录未完成")
        }
        return "Success"
    }

    // 找回密码 - async/await版本
    func forgotPassword(email: String) async throws -> String {
        let _ = try await Amplify.Auth.resetPassword(for: email)
        return "密码重置验证码已发送至 \(email)"
    }
}

// 自定义认证错误类型,方便统一处理
enum AuthError: Error {
    case loginFailed(String)
}

在UIKit中调用时,通过Task启动异步任务,完成后切回主线程更新UI:

let authManager = Auth()

// 调用登录方法
Task {
    do {
        let message = try await authManager.login(email: "your@email.com", password: "yourPassword")
        DispatchQueue.main.async {
            // 更新UI,比如弹出成功提示
            print(message)
        }
    } catch {
        DispatchQueue.main.async {
            // 展示错误信息
            print("登录失败:\(error.localizedDescription)")
        }
    }
}

解决方案二:保留completion闭包风格

如果需要继续使用闭包回调,可以用Task包裹async/await调用,将异步结果转成闭包回调:

import Amplify

class Auth {
    var email: String?
    var password: String?

    // 登录 - 保留completion闭包
    func login(email: String, password: String, completion: @escaping (String?) -> Void) {
        Task {
            do {
                let signInResult = try await Amplify.Auth.signIn(username: email, password: password)
                completion(signInResult.isSignedIn ? "Success" : "登录未完成")
            } catch {
                completion("登录失败:\(error.localizedDescription)")
            }
        }
    }

    // 找回密码 - 保留completion闭包
    func forgotPassword(email: String, completion: @escaping (String?) -> Void) {
        Task {
            do {
                try await Amplify.Auth.resetPassword(for: email)
                completion("密码重置验证码已发送至 \(email)")
            } catch {
                completion("密码重置失败:\(error.localizedDescription)")
            }
        }
    }
}

补充说明

  • 确认你的Podfile中引入的是Amplify v2+版本:
    pod 'Amplify'
    pod 'AmplifyPlugins/AWSCognitoAuthPlugin'
    
  • 不建议降级到v1版本,因为v1已停止维护,不再接收安全更新和功能迭代。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 22:02:45