AWS Amplify Swift API登录iOS移动应用

问题描述 投票:1回答:1

我正在遵循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.")
            }
        }
    }
}

我已实例化该类,并且提供了正确的凭据后,登录也可以工作,我想向警报显示错误消息,但是我可以打印该错误,这是可选的(找不到用户...。),但是我无法将其分配给类变量。

import RxSwift

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


        observable.subscribe { event in
           print(event)
        }
        .disposed(by: disposeBag)
ios rx-swift aws-amplify swift5.1
1个回答
0
投票

我首先会像这样围绕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 { $0.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 { $0.error }
    }
}

尽管我可能不会为AWSUserPool感到烦恼……这取决于您。

© www.soinside.com 2019 - 2024. All rights reserved.