ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • spotify 로그인 구현
    iOS/패스트캠퍼스(앱제작) 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 로그인/로그아웃

    'iOS > 패스트캠퍼스(앱제작)' 카테고리의 다른 글

    신용카드 추천 리스트  (0) 2022.06.14
    코로나 현황판 앱  (0) 2022.05.08
    날씨 앱  (0) 2022.05.08
    타이머 앱  (0) 2022.05.08
    일기장 앱  (0) 2022.04.20

    댓글

Designed by Tistory.