Closed jayn2u closed 6 months ago
ํด๋น PR์ ๋ํ ๋ด์ฉ์ ์์ฝํด์ฃผ์ธ์.
loginButtonTapped
๋ฉ์๋์ logoutButtonTapped
๋ฉ์๋์์ ๋ทฐ๋ฅผ ์ ํํ๋ ๋ถ๋ถ์
๋๋ค.์ฝ๋๋ค์์ ํต์ฌ ์ฝ๋๋ค์ ์ค๋ช ํด์ฃผ์ธ์. ๋๋ ์๊ฒ๋ ๋ถ๋ถ๋ค์ ๊ณต์ ํด์ฃผ์ธ์.
@objc func loginButtonTapped() {
guard let inputEmailString = emailTextField.text,
let inputPasswordString =
passwordTextField.text
else { return }
Auth.auth().signIn(withEmail: inputEmailString, password: inputPasswordString) { authResult, error in
if let error = error {
debugPrint("Error occured in signIn process")
debugPrint("Error message below here")
debugPrint(error.localizedDescription)
}
guard let authResult = authResult else { return }
debugPrint(authResult)
let profileLoginedViewController = ProfileLoginedViewController()
profileLoginedViewController.emailLabel.text = inputEmailString
guard let sceneDelegate = UIApplication.shared.connectedScenes.first?.delegate as? SceneDelegate else { return }
sceneDelegate.window?.rootViewController = profileLoginedViewController
}
}
@objc func logoutButtonTapped() {
debugPrint("Logout success...!")
guard let sceneDelegate = UIApplication.shared.connectedScenes.first?.delegate as? SceneDelegate else { return }
sceneDelegate.window?.rootViewController = MainViewController()
}
self.present()
๋ฅผ ์ฌ์ฉํด์ ๋ทฐ๋ฅผ modal
ํํ๋ก ์ฐ๊ฒฐํ์๋๋ฐ, SceneDelegate.swift
์์ ๋ณผ ์ ์๋ ๋ฃจํธ๋ทฐ๋ฅผ ๋ณํํ๋ ์์
์ ์ผ๋์ ๋๊ณ ์์
ํ์ต๋๋ค.์์ ํ์๋ฉด์ ๊ถ๊ธํ๋ ์ง๋ฌธ๋ค์ ๋จ๊ฒจ์ฃผ์ธ์.
simulator ์์์ ํ๋ฉด ๋ นํ ํ ๋ณด์ฌ์ฃผ์ธ์.
ํด๋น PR์ ๋ํ ๋ด์ฉ์ ์์ฝํด์ฃผ์ธ์.
Firebase
์ UserDefaults
๋ฅผ ์ฌ์ฉํด์ Auto-login
๋ก์ง ๊ตฌํ์ ์ฑ๊ณตํ์ต๋๋ค.
์ฝ๋๋ค์์ ํต์ฌ ์ฝ๋๋ค์ ์ค๋ช ํด์ฃผ์ธ์. ๋๋ ์๊ฒ๋ ๋ถ๋ถ๋ค์ ๊ณต์ ํด์ฃผ์ธ์.
JWT
๋ฅผ ์ฌ์ฉํ๋์ง ์ ํ๋์ง๋ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.์์ ํ์๋ฉด์ ๊ถ๊ธํ๋ ์ง๋ฌธ๋ค์ ๋จ๊ฒจ์ฃผ์ธ์.
ViewController
ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ์๋ฉธํ๋ ๊ณผ์ ์์ ์ฌ๋ฌ ์๊ฐ์ ๋ค์ด๋ณด๊ณ ์ถ์ต๋๋ค.simulator ์์์ ํ๋ฉด ๋ นํ ํ ๋ณด์ฌ์ฃผ์ธ์.
ํด๋น PR์ ๋ํ ๋ด์ฉ์ ์์ฝํด์ฃผ์ธ์.
์ฝ๋๋ค์์ ํต์ฌ ์ฝ๋๋ค์ ์ค๋ช ํด์ฃผ์ธ์. ๋๋ ์๊ฒ๋ ๋ถ๋ถ๋ค์ ๊ณต์ ํด์ฃผ์ธ์.
@objc private func makeUserAuthenticationInfo() {
guard let clientID = FirebaseApp.app()?.options.clientID else { return }
// Create Google Sign In configuration object.
let config = GIDConfiguration(clientID: clientID)
GIDSignIn.sharedInstance.configuration = config
// Start the sign in flow!
GIDSignIn.sharedInstance.signIn(withPresenting: self) { [unowned self] result, error in
guard error == nil else {
return
}
guard let user = result?.user,
let idToken = user.idToken?.tokenString
else {
return
}
let credential = GoogleAuthProvider.credential(
withIDToken: idToken,
accessToken: user.accessToken.tokenString)
Auth.auth().signIn(with: credential) { authResult, error in
if let error = error {
debugPrint(error.localizedDescription)
}
guard let authResult = authResult else { return }
debugPrint(authResult)
}
}
}
credential
๋ก ๋ฐ์์ค๋ ๊ฒฐ๊ณผ๋ฅผ DB์ ์
๋ก๋ ํ๋ ์์
์ด๊ณ ์๋ฃ ํธ๋ค๋ฌ์์ ์ฒ๋ฆฌํ ์ ์๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ ์
๋๋ค.์์ ํ์๋ฉด์ ๊ถ๊ธํ๋ ์ง๋ฌธ๋ค์ ๋จ๊ฒจ์ฃผ์ธ์.
simulator ์์์ ํ๋ฉด ๋ นํ ํ ๋ณด์ฌ์ฃผ์ธ์.
ํด๋น PR์ ๋ํ ๋ด์ฉ์ ์์ฝํด์ฃผ์ธ์.
์ฝ๋๋ค์์ ํต์ฌ ์ฝ๋๋ค์ ์ค๋ช ํด์ฃผ์ธ์. ๋๋ ์๊ฒ๋ ๋ถ๋ถ๋ค์ ๊ณต์ ํด์ฃผ์ธ์.
@objc func logoutButtonTapped() {
let firebaseAuth = Auth.auth()
do {
try firebaseAuth.signOut()
debugPrint("Log-out successfully...!")
guard
let sceneDelegate = UIApplication.shared.connectedScenes.first?.delegate as? SceneDelegate
else { return }
sceneDelegate.window?.rootViewController = GoogleAuthViewController()
} catch {
debugPrint("Error occured in signing out...!")
}
}
signOut()
๋ฉ์๋๋ฅผ ํ์ฉํ์ต๋๋ค.throw
ํ๋ ์ฝ๋์ด๊ธฐ ๋๋ฌธ์ ์๋ฌ ํธ๋ค๋ง ์ฝ๋๋ฅผ ์์ฑํ์ต๋๋ค.์์ ํ์๋ฉด์ ๊ถ๊ธํ๋ ์ง๋ฌธ๋ค์ ๋จ๊ฒจ์ฃผ์ธ์.
๋ฉ๋ชจ๋ฆฌ
์ ๊ดํ ์ง๋ฌธ๊ณผ ์ด์ด์ง๋๋ค.simulator ์์์ ํ๋ฉด ๋ นํ ํ ๋ณด์ฌ์ฃผ์ธ์.
ํด๋น PR์ ๋ํ ๋ด์ฉ์ ์์ฝํด์ฃผ์ธ์.
๊ตฌ๊ธ ์ฌ์ฉ์ ์ธ์ฆ ์ฌ์ฉ ๊ฐ ์๋๋ก๊ทธ์ธ ๋ก์ง์ ๊ตฌํํ์ต๋๋ค.
์ฝ๋๋ค์์ ํต์ฌ ์ฝ๋๋ค์ ์ค๋ช ํด์ฃผ์ธ์. ๋๋ ์๊ฒ๋ ๋ถ๋ถ๋ค์ ๊ณต์ ํด์ฃผ์ธ์.
// SceneDelegate.swift
if let currentUser = Auth.auth().currentUser {
if let savedUID = UserDefaults.standard.string(forKey: "currentUserUID"), savedUID == currentUser.uid {
window?.rootViewController = GoogleAuthLoginedViewController()
} else {
window?.rootViewController = GoogleAuthViewController()
}
} else {
window?.rootViewController = GoogleAuthViewController()
}
SceneDelegate.swift
ํ์ผ์์ rootViewController
๋ฅผ ์ค์ ํ๋ ์ฝ๋๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์์ง ํ๋ฆฌ์ง ์๋ ์๋ฌธ์ ๋ค์ ์์ต๋๋ค.
UserDefaults
์ ์ด๋ค ๊ฐ๋ค์ ํ ๋นํด์ ํ์ฉํด์ผ ์ข์ ํ์ฉ ์ฝ๋๊ฐ ๋ ์ง ์กฐ๊ธ ๋ ๊ณ ๋ฏผํ๊ณ ์ถ์ต๋๋ค.
์์ ํ์๋ฉด์ ๊ถ๊ธํ๋ ์ง๋ฌธ๋ค์ ๋จ๊ฒจ์ฃผ์ธ์.
SceneDelegate.swift
ํ์ผ์์ ์์ฑ๋ ์ฝ๋๋ค์ ํ์ฉํ๋ ๋ถ๋ถ์ ๊ฒํ ํ๊ณ ๋ค์ํ ์๊ฐ๋ค์ ๋ค์ด๋ณด๊ณ ์ถ์ด์!
๋๋ผ๋ฉด ์ด๋ป๊ฒ ์ฝ๋๋ฅผ ์์ฑํ์ ๊ฒ ๊ฐ๋ค! ์ด๋ ๊ฒ ๋ค์ํ ์๊ฐ๋ค์ ๋ค์ด๋ณด๊ณ ์ถ์ต๋๋ค.
simulator ์์์ ํ๋ฉด ๋ นํ ํ ๋ณด์ฌ์ฃผ์ธ์.
์ ์ด์ ์ํฌ๋ถ ๋ฏธ์ ์ ๋ํด์ ๊ตฌ๊ธ ๋ก๊ทธ์ธ๊น์ง ํผ ๋๋ฌด ์ข์ต๋๋ค!!!
๋ํด์ ์ ๊ฐ ์๋ ์ผ๋ฐ ๋ก๊ทธ์ธ ๋ก์ง์ ๋ํด ์ค๋ช ํด๋๋ฆฌ์๋ฉด,, ๋จผ์ ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ๋ฉด ์๋ฒ์์
accessToken
๊ณผrefreshToken
์ ์ฃผ์ดUserDefault
๊ฐ ์๋keyChain
์ ์ ์ฅํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋๋ก๊ทธ์ธ ์๋ฆผ์ ๋์์UserDefault
์๋isAutoLogin
์ด๋ผ๋ ์๋๋ก๊ทธ์ธ ๋ณ์๋ง ๋ด์๋์! (์ถ๊ฐ์ ์ผ๋ก ์ฌ์ฉ์ ์ด๋ฆ ๋ฑ ํ๋กํ ์ ๋ณด ์ ์ฅํ ์๋ ์์ด์) ๋ค์ ์ฑ์ ์ ์ํ ๋isAutoLogin
๊ณผ ํ ํฐ์ด ๋ง๋ฃ๋๋์ง์ ์ฌ๋ถ๋ฅผ ์ดํํ, ๋ก๊ทธ์ธ๋ทฐ๋ก ๊ฐ์ง ๋ฉ์ธ๋ทฐ๋ก ๊ฐ์ง ๊ฒฐ์ ํฉ๋๋ค!! (์ด๋ถ๋ถ์ ๋ํด ์ดํด๊ฐ ์๋์ ๋ค๋ฉด ๊น์ ๋ด์ฉ์ด๋ค๋ณด๋, PR๋ณด๋ค๋ ํด๋น PR๋จผ์ ์ ๋ฆฌํ ๋จธ์ง ์ํจ ๋ค์, ๊ฐ์ธ์ ์ผ๋ก ์ง๋ฌธํด์ฃผ์ธ์..!)
์์ธํ ๋ต๋ณ ๋๋ฌด ๊ณ ๋ง์์. ์๊ทธ๋๋ ํด๋ผ์ด์ธํธ ํผ์์ ์๋ฒ์ ํต์ ์ ํด์ผ ํ๋ ๋ถ๋ถ์ ๋ค๋ฃจ๋ค๋ณด๋, ์กฐ๊ธ ๋ฆฌ์์น ํด์ผ ํ ๋ถ๋ถ๋ค์ด ๋ง์์ง ๊ฒ ๊ฐ์๋ฐ, JWT
๋ฅผ ์ฌ์ฉํ ์ฌ์ฉ์ ์ธ์ฆ ๋ฐฉ์์ ๋ํด์ ๋ฆฌ์์น๋ฅผ ํด๋ณด๋ ์ค ์
๋๋ค. ์ํฉ ์ง์์ ์ผ๋ก ์
๋ฐ์ดํธ ํ ๊ฒ์!
๐Summary
๊ตฌ๊ธ ์ฌ์ฉ์ ์ธ์ฆ ์ฌ์ฉ ๊ฐ ์๋๋ก๊ทธ์ธ ๋ก์ง์ ๊ตฌํํ์ต๋๋ค.
๐กPR Point
SceneDelegate.swift
ํ์ผ์์rootViewController
๋ฅผ ์ค์ ํ๋ ์ฝ๋๋ผ๊ณ ์๊ฐํฉ๋๋ค.์์ง ํ๋ฆฌ์ง ์๋ ์๋ฌธ์ ๋ค์ ์์ต๋๋ค.
UserDefaults
์ ์ด๋ค ๊ฐ๋ค์ ํ ๋นํด์ ํ์ฉํด์ผ ์ข์ ํ์ฉ ์ฝ๋๊ฐ ๋ ์ง ์กฐ๊ธ ๋ ๊ณ ๋ฏผํ๊ณ ์ถ์ต๋๋ค.๐ค Question
SceneDelegate.swift
ํ์ผ์์ ์์ฑ๋ ์ฝ๋๋ค์ ํ์ฉํ๋ ๋ถ๋ถ์ ๊ฒํ ํ๊ณ ๋ค์ํ ์๊ฐ๋ค์ ๋ค์ด๋ณด๊ณ ์ถ์ด์!๋๋ผ๋ฉด ์ด๋ป๊ฒ ์ฝ๋๋ฅผ ์์ฑํ์ ๊ฒ ๊ฐ๋ค! ์ด๋ ๊ฒ ๋ค์ํ ์๊ฐ๋ค์ ๋ค์ด๋ณด๊ณ ์ถ์ต๋๋ค.
๐ย Simulator