로그인, 회원가입 기능을 수정하는 작업을 진행하게 되었다. 해당 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()함수를 이용해 회원가입이 완료되었다는 문구를 띄운후 원하는 창으로 이동할 수 있도록 했다.
'iOS 개발 > SwiftUI' 카테고리의 다른 글
[SwiftUI] - Firebase firestore 객체 데이터 삭제 (0) | 2023.02.12 |
---|---|
[SwiftUI] firebase firstore 데이터 CRUD (0) | 2023.01.31 |
[SwiftUI] - Firebase Firestore 데이터 저장하기, Cannot convert value of type 'TrackInfo' to expected argument type '[String : Any] 오류 해결 (1) | 2023.01.23 |
[SwiftUI] - custom list item 만들기 (0) | 2023.01.17 |
[SwiftUI] - 설정 화면(View) 구현하기 (2) | 2023.01.07 |