본문 바로가기

개발

RxSwift로 자동 로그인 기능 로직 만들기

728x90

RxSwift를 사용한 간단한 자동 로그인 기능 구현

RxSwift를 사용하여 간단한 자동 로그인 기능을 구현하는 방법은 다음과 같습니다.

1. 저장소 사용

  • 사용자 로그인 정보 (예: ID, 비밀번호)를 안전하게 저장하기 위해 UserDefaults 또는 Keychain과 같은 저장소를 사용합니다.

2. ViewModel 설정

  • ViewModel클래스를 만들고 자동 로그인 로직을 담당할 속성과 메서드를 정의합니다.
  • 저장된 로그인 정보를 불러오고, 자동 로그인 여부를 판단하는 로직을 구현합니다.
import RxSwift

import KeychainSwift



class LoginViewModel {

    let isAutoLoginEnabled = BehaviorSubject<Bool>(value: false)

    let loginResult = PublishSubject<LoginResult>()



    private let keychain = KeychainSwift()

    private let disposeBag = DisposeBag()



    init() {

        loadAutoLoginSettings()

    }



    private func loadAutoLoginSettings() {

        if let savedEmail = keychain.get("email"),

           let savedPassword = keychain.get("password") {

            isAutoLoginEnabled.onNext(true)

            login(email: savedEmail, password: savedPassword)

        } else {

            isAutoLoginEnabled.onNext(false)

        }

    }



    func login(email: String, password: String) {

        // 실제 로그인 API 호출 및 처리

        // 예시:

        DispatchQueue.main.asyncAfter(deadline: .now() + 2) { [weak self] in

            if email == "user@example.com" && password == "password" {

                self?.loginResult.onNext(.success)

                // 저장된 로그인 정보가 없거나 유효하지 않은 경우 저장

                if !self!.keychain.get("email")! || !self!.keychain.get("password")! {

                    self!.keychain.set(email, forKey: "email")

                    self!.keychain.set(password, forKey: "password")

                }

            } else {

                self?.loginResult.onNext(.failure(NSError(domain: "LoginError", code: 101, userInfo: nil)))

            }

        }

    }

}



enum LoginResult {

    case success

    case failure(Error)

}

 

3. 자동 로그인 시도

  • ViewController에서 ViewModel의 isAutoLoginEnabled Observable을 구독하고, 자동 로그인이 활성화된 경우 login 메서드를 호출합니다.
class LoginViewController: UIViewController {



    private let viewModel = LoginViewModel()

    private let disposeBag = DisposeBag()



    override func viewDidLoad() {

        super.viewDidLoad()



        setupBindings()

    }



    private func setupBindings() {

        viewModel.isAutoLoginEnabled

            .subscribe(onNext: { [weak self] in

                if $0 {

                    self?.viewModel.login(email: "저장된 이메일", password: "저장된 비밀번호") // 실제 저장된 값으로 변경

                }

            })

            .disposed(by: disposeBag)



        viewModel.loginResult

            .subscribe(onNext: { [weak self] result in

                self?.handleLoginResult(result)

            })

            .disposed(by: disposeBag)

    }



    // ... (이전 코드와 동일)

}

 

4. 사용자 설정

  • 사용자가 자동 로그인 기능을 활성화하거나 비활성화할 수 있는 설정 화면을 제공합니다.
  • 설정 변경 시 isAutoLoginEnabled BehaviorSubject의 값을 업데이트하고, 저장된 로그인 정보를 관리합니다.

참고:

  • 이 코드는 기본적인 예시이며 실제 구현에서는 보안을 고려하여 로그인 정보를 안전하게 저장하고, 사용자 동의를 얻은 후 자동 로그인을 수행해야 합니다.
  • RxSwift의 다양한 연산자와 API를 활용하여 더욱 정교하고 효율적인 자동 로그인 기능을 구현할 수 있습니다.