iOS/패스트캠퍼스(앱제작)

spotify 로그인 구현

soultreemk 2022. 5. 15. 16:23

 

 

1.  기본 UI구성

더보기

- LoginVC

import UIKit

class LoginViewController: UIViewController {
    @IBOutlet weak var emailLoginBtn: UIButton!
    @IBOutlet weak var googleLoginBtn: UIButton!
    @IBOutlet weak var appleLoginBtn: UIButton!
    
    override func viewDidLoad() {
        [emailLoginBtn, googleLoginBtn, appleLoginBtn].forEach {
            $0?.layer.borderWidth = 1
            $0?.layer.borderColor = UIColor.white.cgColor
            $0?.layer.cornerRadius = 30
        }
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        // Navigation Bar 숨기기 (첫화면 이므로)
        navigationController?.navigationBar.isHidden = true
    }
    
    @IBAction func googleLoginBtnTapped(_ sender: UIButton) {
        // Firebase 인증
    }
    
    
    @IBAction func appleLoginBtnTapped(_ sender: UIButton) {
    }
}

 

- EnterEmailVC

import UIKit

class EnterEmailViewController: UIViewController {
    @IBOutlet weak var emailTextField: UITextField!
    @IBOutlet weak var passwordTextField: UITextField!
    @IBOutlet weak var errorMsgLabel: UILabel!
    @IBOutlet weak var nextBtn: UIButton!
    
    override func viewDidAppear(_ animated: Bool) {
        nextBtn.layer.cornerRadius = 30
        nextBtn.isEnabled = false
        // 화면 첫 진입시 커서를 emailTextField로 설정
        emailTextField.becomeFirstResponder()
        
        emailTextField.delegate = self
        passwordTextField.delegate = self
        
    }
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        // Navigation Bar 다시 보이기
        navigationController?.navigationBar.isHidden = false
    }

    override func viewDidLoad() {
        super.viewDidLoad()

    }
    
    @IBAction func nextBtnTapped(_ sender: UIButton) {
    }
    
}

extension EnterEmailViewController: UITextFieldDelegate {
    // 이메일, 비밀번호 업력 후 return버튼 클릭 시 키보드 내리기
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        view.endEditing(true)
        return false
    }
    // 이메일, 비밀번호 입력 시 버튼 활성화
    func textFieldDidEndEditing(_ textField: UITextField) {
        let isEmailEmpty = emailTextField.text == ""
        let isPwdEmpty = passwordTextField.text == ""
        nextBtn.isEnabled = !isEmailEmpty && !isPwdEmpty
    }
}

 

- MainVC

import UIKit

class MainViewController: UIViewController {
    @IBOutlet weak var welcomeLabel: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // 메인 진입 시 제스처 인식 안되도록 설정
        navigationController?.interactivePopGestureRecognizer?.isEnabled = false
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        navigationController?.navigationBar.isHidden = true
    }
    
    
    @IBAction func logoutBtnTapped(_ sender: UIButton) {
        self.navigationController?.popToRootViewController(animated: true)
        
    }
}

 

2.    EnterEmailVC에서 이메일/비밀번호 입력시 회원가입 완료 ->  MainVC로 진입

2.1  이후 동일 이메일/비밀번호로 로그인 시 MainVC로 진입

2.2  로그아웃

더보기

- EnterEmailVC

    @IBAction func nextBtnTapped(_ sender: UIButton) {
        // Firebase 이메일/비밀번호 인증
        let email = emailTextField.text ?? ""
        let pwd = passwordTextField.text ?? ""
        
        // Firebase 인증 플랫폼에 전달
        // 1) 신규 사용자 생성
        Auth.auth().createUser(withEmail: email, password: pwd) { [weak self]
            authResult, error in
            guard let self = self else { return }
            // 에러 처리
            if let error = error {
                let code = (error as NSError).code
                switch code {
                case 17007: // 이미 가입한 계정일때
                    // 로그인하기
                    self.loginUser(withEmail: email, password: pwd)
                default:
                    self.errorMsgLabel.text = error.localizedDescription
                }
            } else {  // 계정이 잘 생성되면 MainVC로 이동
                self.showMainVC()
            }
        }
    }
    private func showMainVC() {
        let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
        let mainViewController = storyboard.instantiateViewController(withIdentifier: "MainViewController")
        mainViewController.modalPresentationStyle = .fullScreen
        navigationController?.show(mainViewController, sender: nil)
    }
    
    private func loginUser(withEmail email:String, password: String) {
        Auth.auth().signIn(withEmail: email, password: password) { [weak self] _, error in
            guard let self = self else { return }
            
            if let error = error {
                self.errorMsgLabel.text = error.localizedDescription
            } else {
                self.showMainVC()
            }
        }
    }

 

- MainVC

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        navigationController?.navigationBar.isHidden = true
        
        let email = Auth.auth().currentUser?.email ?? "고객"
        welcomeLabel.text = "환영합니다. \(email)님"
        
    }
    
    // 로그아웃 구현
     @IBAction func logoutBtnTapped(_ sender: UIButton) {
        let firebaseAuth = Auth.auth()
        
        do {
            try firebaseAuth.signOut()
            self.navigationController?.popToRootViewController(animated: true)
        } catch let signOutError as NSError {
            print(signOutError.description)
        }
    }

 

3.  Google 로그인/로그아웃

 

4. Apple 로그인/로그아웃