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 로그인/로그아웃