AWS Amplify Swift API 登录 iOS 移动应用程序

AWS Amplify Swift API login iOS Mobile App

我正在关注 docs 通过 API、

实现登录
class AWSUserPool {

    var userAuthenticationError: Error?

    AWSMobileClient.default().signIn(username: <param username>, password: <param password>) { (signInResult, error) in
        if let error = error  {
            print("\(error.localizedDescription)")
            self.userAuthenticationError = error
        } else if let signInResult = signInResult {
            switch (signInResult.signInState) {
            case .signedIn:
                print("User is signed in.")
            case .smsMFA:
                print("SMS message sent to \(signInResult.codeDetails!.destination!)")
            default:
                print("Sign In needs info which is not yet supported.")
            }
        }
    }
}

我已经实例化了 class 并且在提供正确的凭据时登录有效,我想将错误消息显示为警报,但我可以打印可选的错误(未找到用户。 ...) 但我无法将其分配给 class 变量。

import RxSwift

        let observable: Observable<Error?> = Observable<Error?>.just(self.awsUserPool?.userAuthenticationError)
        let disposeBag = DisposeBag()


        observable.subscribe { event in
           print(event)
        }
        .disposed(by: disposeBag)

我会先围绕 AWSMobileClient 编写一个响应式包装器,如下所示:

extension Reactive where Base: AWSMobileClient {
    func signIn(username: String, password: String) -> Observable<SignInResult> {
        return Observable.create { observer in
            self.base.signIn(username: username, password: password) { (signinResult, error) in
                if let signinResult = signinResult {
                    observer.onNext(signinResult)
                    observer.onCompleted()
                }
                else {
                    observer.onError(error ?? RxError.unknown)
                }
            }
            return Disposables.create()
        }
    }
}

然后将错误放入 Observable 中,执行如下操作:

class AWSUserPool {

    let userAuthenticationError: Observable<Error>
    private let disposeBag = DisposeBag()

    init(username: String, password: String) {
        let result = AWSMobileClient.default().rx.signIn(username: username, password: password)
            .materialize()

        result
            .compactMap { [=11=].element }
            .subscribe(onNext: { signinResult in
                switch signinResult.signInState {
                case .signedIn:
                    print("User is signed in.")
                case .smsMFA:
                    print("SMS message sent to \(signinResult.codeDetails!.destination!)")
                default:
                    print("Sign In needs info which is not yet supported.")
                }
            })
            .disposed(by: disposeBag)
        userAuthenticationError = result.compactMap { [=11=].error }
    }
}

虽然我可能不会为 AWSUserPool 而烦恼...这取决于您。