iOS 개발/SwiftUI

[SwiftUI] - firebase 회원가입, 로그인 시 에러 처리 View에 적용하기

bamtorii 2023. 1. 31. 18:25
반응형

로그인, 회원가입 기능을 수정하는 작업을 진행하게 되었다. 해당 View를 구성하는 데 있어서 이메일 형식, 비밀번호 형식이 아니거나 비밀번호와 비밀번호 확인이 동일하지 않을 때 에러를 출력하는 것은 어렵지 않았다. 그러나 firebase와 연동해 해당 이메일이 이미 존재하거나, 이메일을 잘못 입력했을 때 이를 view에 보이게 하는 문제에 직면했다.

 

우선 이메일 형식, 비밀번호 형식을 구분하는 함수는 다음과 같다.(해당 함수는 다른 여러 곳에도 소개되어 있다)

//이메일 형식 확인 함수
func checkEmail(str: String) -> Bool {
    let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}"
    return  NSPredicate(format: "SELF MATCHES %@", emailRegex).evaluate(with: str)
}

//비밀번호 형식 확인 함수
func checkPassword(str: String) -> Bool {
    let passwordRegex = "^(?=.*[A-Za-z])(?=.*[0-9])(?=.*[!@#$%^&*()_+=-]).{8,50}"
    return  NSPredicate(format: "SELF MATCHES %@", passwordRegex).evaluate(with: str)
}

다음과 같이 이메일 형식이 아니거나, 8자리 이상의 영어+숫자+특수문자 조합이 아니면 false를 반환하는 함수이다. view에서도 input에 따라 해당 함수를 활용해 오류 메시지를 출력해주면 된다.

 

다음은 이메일이 이미 존재하거나, 이메일을 잘못 입력했을 때 오류 메시지를 출력하는 경우이다. 이메일, 비밀번호 입력후 다음의 버튼을 클릭하는 로직이다.

mainView.swift

Button {
	emailAuthVM.login(email: emailInput, password: passwordInput)
	}, label: {
	ButtonView(text: "로그인")
}

 

emailAuthVM.swift

func login(email: String, password: String) {
        Auth.auth().signIn(withEmail: email + "2", password: password) { result, error in
            if let error = error {
                print("Error : \(error.localizedDescription)")
                self.loginError = loginErrorhandler(error: error.localizedDescription)
                return
            }
            self.loginError = ""
            self.logStatus = true // contentview에서 home으로 갈지 login으로 갈지 결정해줌. 로그인 누르면 homeview로 넘어가도록 함
        }
    }

 

 

버튼을 클릭하면 emailAuthVM의 login함수가 실행되게 된다. emailAuthVM에 loginError라는 String타입의 변수를 만들어서 오류를 받고 이를 mainview에 넘겨 사용하려는 계획을 세웠다.

그래서 mainview의 button action부분에서 emailAuthVM.login(email: emailInput, password: passwordInput)을 실행시킨후 emailAuthVM.loginError를 출력해봤다. 그러나 해당 login()함수가 실행되기 전의 비어있는 상태의 loginError를 출력하는 현상이 발생했다. 

따라서 이를 해결하기 위해  mainview에서

HStack {
    if viewModel.signUpError == "" {
        Text(signUpErrorMessage)
        .font(FontManager.caption2)
        .foregroundColor(ColorManager.negativeColor)
    } else if viewModel.signUpError == "이미 해당 이메일이 존재합니다" {
        Text(viewModel.signUpError)
        .font(FontManager.caption2)
        .foregroundColor(ColorManager.negativeColor)
    } else if viewModel.signUpError == "회원가입이 완료되었습니다"{
        Text(viewModel.signUpError)
        .font(FontManager.caption2)
        .foregroundColor(ColorManager.negativeColor)
        .onAppear(perform: { signUpScreen.toggle() })
    }
}

다음과 같은 코드를 작성했다. signUpErrorMessage는 이메일 형식, 비밀번호 형식이 잘못되었을 때 나오는 문구이다. 그 외의 경우 emailAuthVM.signUpError를 이용해 해당 문구에 따라 각각 다른 text를 출력하게 했다. 그리고 회원가입이 완료되면 .onAppear()함수를 이용해 회원가입이 완료되었다는 문구를 띄운후 원하는 창으로 이동할 수 있도록 했다.

 

 

반응형