AWS Усиление входа в Swift API iOS Мобильное приложение - PullRequest
1 голос
/ 04 мая 2020

Я следую документам для реализации входа в систему через 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)

1 Ответ

0 голосов
/ 08 мая 2020

Я бы сначала написал реактивную оболочку вокруг 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 ... Это зависит от вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...