iOS端amplify-swift 1.15.1登录流程抛出Amplify.AuthError error 2求助
问题分析与解决办法
首要问题:混用两套认证API的状态判断
你代码里用AWSMobileClient.default().isSignedIn判断登录状态,但后续登出、登录却用Amplify的接口——这两套API的状态管理是相互独立的,状态不同步就会触发异常。比如Amplify的会话已经失效,但AWSMobileClient还显示已登录,这时执行登出操作就可能因为会话不一致抛出AuthError error 2。
代码修正:统一用Amplify的状态判断
把状态判断换成Amplify自身的fetchAuthSession接口,彻底抛弃AWSMobileClient的状态判断:
func nativeLogin( email: String?, password: String?, completion: @escaping (Result<Authstate, Error>) -> Void ) { Amplify.Auth.fetchAuthSession { [weak self] result in guard let self = self else { return } DispatchQueue.main.async { switch result { case .success(let session): if session.isSignedIn { let options = AuthSignOutRequest.Options(globalSignOut: true) Amplify.Auth.signOut(options: options) { signOutResult in DispatchQueue.main.async { switch signOutResult { case .success: guard let email = email, let password = password else { self.response(completion, .failure(AuthError.passwordValidationError("Missing Email/Password"))) return } self.signIn(email: email, password: password, completion: completion) case .failure(let error): completion(.failure(error)) } } } } else { guard let email = email, let password = password else { self.response(completion, .failure(AuthError.passwordValidationError("Missing Email/Password"))) return } self.signIn(email: email, password: password, completion: completion) } case .failure(let error): completion(.failure(error)) } } } }
版本升级的必要性
Amplify Swift 1.15.1到2.2.1之间修复了不少认证相关的bug,包括:
- 全局登出后本地会话清理不彻底的问题
- 认证状态同步逻辑优化
- 部分场景下
AuthError error 2(一般对应会话过期或无效)的修复
如果修正代码后还是有问题,建议直接升级到2.2.1,升级后记得重新拉取Amplify配置文件,避免版本不兼容。
额外排查方向
- 检查你的
signIn方法实现,确认是否正确处理了Amplify的回调,有没有遗漏错误分支 - 排查用户设备的网络情况,全局登出需要和Cognito服务端同步,网络波动可能导致登出不彻底,进而引发登录错误
内容的提问来源于stack exchange,提问作者Apoplectic
相关产品推荐
相关产品推荐

