포스트

FlashChat (4)

회원가입 구현

https://firebase.google.com/docs/auth/ios/password-auth?hl=ko&authuser=0&_gl=1*nhoeg5*_up*MQ..*_ga*ODkxMDIxNTcuMTcxMDgxMzgwMQ..*_ga_CW55HF8NVT*MTcxMDgxMzgwMS4xLjEuMTcxMDgxNDg1OC4wLjAuMA..

해당 내용에 대한 Firebase Docs가 있다. 한번 읽어두자.

다시 Firebase 사이트로 돌아와서 Authentication을 클릭하자.

그리고 시작하기를 누르면

여러가지가 나온다.

이메일/비밀번호로 한번 해보자.

활성화를 해주고 저장을 눌러서 나가자

Docs로 가자.

설명대로 진행해주면 된다.

그리고 5번의 내용을

회원가입을 담당하는 RegisterVC에 복붙하자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import UIKit
import FirebaseCore
import FirebaseFirestore
import FirebaseAuth

class RegisterViewController: UIViewController {

    @IBOutlet weak var emailTextfield: UITextField!
    @IBOutlet weak var passwordTextfield: UITextField!
    
    @IBAction func registerPressed(_ sender: UIButton) {
        Auth.auth().createUser(withEmail: email, password: password) { authResult, error in
        }
    }
    
}

필요한 것들은 import를 해둔다.

뭘해야할지 모르면? Docs에 다 나와있다.

이후에 email, password 에러는 textField와 연관이 있다.

변수를 만들어서 에러를 해결해 주자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class RegisterViewController: UIViewController {

    @IBOutlet weak var emailTextfield: UITextField!
    @IBOutlet weak var passwordTextfield: UITextField!
    
    @IBAction func registerPressed(_ sender: UIButton) {
        
        if let email = emailTextfield.text, let password = passwordTextfield.text {
            Auth.auth().createUser(withEmail: email, password: password) { authResult, error in
                if let e = error { // 에러 발생하면
                    print(e)
                } else { // 에러가 발생하지 않는다면
                    //Navigate to the ChatViewController
                    self.performSegue(withIdentifier: "RegisterToChat", sender: self)
                }
            }
        }
    }
    
}

위와 같이 코드를 작성해 주었다.

옵셔널 바인딩을 해주었고, 에러가 발생하지 않을때 즉 정상적으로 회원 가입이 완료 되었을때는 segue를 통해 채팅이 가능한 화면으로 이동하게 하였다.

작동 테스트를 해보자.

기능 테스트 할때는 1@2.com 이런식으로 간단하게 맞춰주면 된다.

비밀번호는 최소 6자리를 입력해줘야한다!.

안그러면 에러가 출력된다

1
Error Domain=FIRAuthErrorDomain Code=17026 "The password must be 6 characters long or more."

무튼 기능은 잘된다.

근데 콘솔창에 아래와 같은 내용이 나온다?

1
Cannot show Automatic Strong Passwords for app bundleID: co.Harold.Flash-Chat-iOS13 due to error: iCloud Keychain is disabled

이건 에러가 아니라, 우리가 보통 회원가입할때 비밀번호를 입력하려고하면

이렇게 강력한 비밀번호로 세팅하는걸 추천하는데, 그게 활성화가 안되있어서 알려주는것이다.

그리고 다시 Firebase 웹페이지로 돌아가서 Authentication의 사용자를 확인해보면?

이렇게 연동이 되어 등록이 된걸 알 수 있다!

예전에 회원가입 이런거 구현할때는 sql에 Database생각해가면서 만들었는데, 그때 고생을 해봐서 그런가

이건 너무 신세계다 :)

하지만 정보보안, 그리고 해킹의 경우를 생각해서 비밀번호를 보여주지는 않는다. 구글에서 관리를 한다.

print(e.localizedDescription) 이걸 사용하게되면

에러도 선택한 언어로 에러메세지가 나온다.

확인해보자.

애석하게도 한국은 안되나보다…

나중에 여러 지역으로 테스트 해봐야겠다.

로그인 구현

Firebase Docs를 보면 이메일 주소와 비밀번호로 사용자 로그인에대한 글이 있다.

읽어보자.

일단 내방식 대로 적어봤다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@IBAction func loginPressed(_ sender: UIButton) {
        
        if let email = emailTextfield.text, let password = passwordTextfield.text {
            Auth.auth().signIn(withEmail: email, password: password) { [weak self] authResult, error in
              guard let strongSelf = self else { return }
               
                if let e = error {
                    print(e.localizedDescription)
                } else {
                    
                    self?.performSegue(withIdentifier: "LoginToChat", sender: self)
                    
                }
                
            }
        }
        
    }

그런데 strongSelf는 뭘하려고 하는지 모르겠다.

역시나 강의에서는 무시하고 진행했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 @IBAction func loginPressed(_ sender: UIButton) {
        
        if let email = emailTextfield.text, let password = passwordTextfield.text {
            Auth.auth().signIn(withEmail: email, password: password) { authResult, error in
                if let e = error {
                    print(e.localizedDescription)
                } else {
                    
                    self.performSegue(withIdentifier: "LoginToChat", sender: self)
                    
                }
                
            }
        }
        
    }

그래도 작동은 잘 된다.

로그아웃 구현하기

Navigation Bar에 버튼을 추가한다.

일반적인 buttond을 여태 썼다면, 이번엔 Bar Button 이다.

1
2
3
4
5
6
7
8
9
@IBAction func logOutPressed(_ sender: UIBarButtonItem) {
        
        do {
          try Auth.auth().signOut()
        } catch let signOutError as NSError {
          print("Error signing out: %@", signOutError)
        }
        
    }

Docs대로 해주었다.

근데 작동이 안된다? 에러메세지도 없다.

뭐가 문제인걸까?

생각해보니 진짜 로그아웃만 있고 이걸 눌렀을때 로그아웃이 되면서 특정 화면으로 이동해야하는 코드가 없다.

그럼 메인화면까지 back을 누르면서 가야할까?

아니다!

한번에 rootVC까지 갈수있는 메서드가 있다!

navigationController?.popToRootViewController(animated: true)

이젠 작동이 잘 된다.

채팅 화면에 있는 Back 버튼 지우기.

1
2
3
4
5
override func viewDidLoad() {
        super.viewDidLoad()
        
        navigationItem.hidesBackButton = true
    }

사라졌다.

앱을 재시동 할때마다 로그인을 해야하기 불편하다면

이렇게 미리 부여를 해두는 방법도 있다.

실행하면?

이젠 간편하게 로그인 할 수 있다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.