Swift UI - 4. ๋ก๊ทธ์ธ UI ํ๋ฉด ๊ตฌํ
์ด์ ์ ๊ตฌํํ ํ์๊ฐ์ ์ผ๋ก ํ์์ด ๋ฑ๋ก๋์๋ค(DRF๋ก ํ์๊ฐ์ API๋ฅผ ๊ตฌํ) ์ด์ ๋ฑ๋ก๋ ํ์์ผ๋ก ๋ก๊ทธ์ธ์ ์งํํ๊ณ ํค์ฒด์ธ์ ์ด์ฉํด์ Access Token ๋ฐ Refresh Token์ ์ ์ฅํ์ฌ ์ฑ ์ฌ์ฉ ์ค ๋ก๊ทธ์ธ ์ํ๋ฅผ ์ ์งํ ์ ์๋๋ก ํด๋ณด์.
//
// LoginView.swift
// mbtiPlayground
//
// Created by ๋ฐ์ข
ํ on 2022/03/16.
//
import SwiftUI
struct LoginView: View {
@State private var email: String = ""
@State private var password: String = ""
@State private var loginStatus: Bool = false // TODO env ๋ณ์๋ก ์ ์ธ ํ ํ ํฐ ๊ณ์ ํ์ธ
@State private var userAccessToken: String = ""
var body: some View {
NavigationView{
if self.loginStatus != false {
ProfileDetail(userEmail: self.email, userAccessToken: self.userAccessToken)
} else {
VStack{
Text("Sign In")
.font(.title)
.fontWeight(.medium)
.padding()
.foregroundColor(.black)
HStack{
Image(systemName: "person.fill")
.resizable()
.scaledToFit()
.frame(width: 30, height: 30)
.padding(.bottom)
TextField("๋๋ค์์ ์
๋ ฅํ์ธ์.", text: $email)
.frame(width: 300, height: 10)
.padding()
.background(Color(.systemGray6))
.cornerRadius(5.0)
.padding(.bottom, 20)
}
HStack{
Image(systemName: "lock")
.resizable()
.scaledToFit()
.frame(width: 30, height: 30)
.padding(.bottom)
SecureField("๋น๋ฐ๋ฒํธ๋ฅผ ์
๋ ฅํ์ธ์", text: $password)
.frame(width: 300, height: 10)
.padding()
.background(Color(.systemGray6))
.cornerRadius(5.0)
.padding(.bottom, 20)
}
HStack{
Button(action: {
print(self.email + self.password)
let rft = readItemKeyChain(userId: self.email)
if rft != nil {
UserDefaults.standard.set(rft, forKey: self.email)
}else{
sendPostRequest("<http://localhost:8000/auth/login>", parameters: ["username": self.email, "password": self.password]){
responseObject, error in guard let _ = responseObject, error == nil else {
print(error ?? "Unknown error")
return
}
self.loginStatus = true
if let rftToken = responseObject{
let rft = rftToken["refresh"] as? String
self.userAccessToken = rftToken["access"] as? String ?? ""
setItemKeyChain(userId: self.email, rft: rft!)
UserDefaults.standard.set(rft, forKey: self.email)
}
}
}
}){
Text("๋ก๊ทธ์ธ")
.frame(width: 80, height: 10)
.font(.headline)
.foregroundColor(.white)
.padding()
.background(Color(.systemBlue))
.cornerRadius(10)
}
.padding()
NavigationLink(destination: SignUpView()){
Text("ํ์๊ฐ์
")
.frame(width: 80, height: 10)
.font(.headline)
.foregroundColor(.white)
.padding()
.background(Color(.systemBlue))
.cornerRadius(10)
}
}
}
.padding(.all, 30)
.navigationBarTitle("", displayMode: .inline)
.navigationBarHidden(true)
}
}
}
}
struct LoginView_Previews: PreviewProvider {
static var previews: some View {
LoginView()
}
}
์ฐ์ 21๋ฒ ์งธ ์ค์์ ์ ์ ์ ๋ก๊ทธ์ธ ์ํ์ ๋ฐ๋ผ ํ๋กํ ์ํ(๋ก๊ทธ์ธ ํ ์ ์ ์ ์ ๋ณด๋ฅผ ๋ณด์ฌ์ค ํ์ด์ง)๋ฅผ ๋ณด์ฌ์ค์ง ์๋๋ฉด ๋ก๊ทธ์ธ ํ๋ฉด์ ๋ณด์ฌ์ค์ง์ ๋ํด ์กฐ๊ฑด๋ฌธ์ ๋ฃ์๋ค.
UI์์๋ ๋๋ค์๊ณผ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํ์ฌ ๋ก๊ทธ์ธํ๋ ํ๋ฉด์ ๊ตฌํํ์๋ค. (๋ก๊ทธ์ธ ์ ์ด๋ฉ์ผ ๋๋ ๋๋ค์์ ์ฌ์ฉํ๋๋ก ๊ตฌํํ ์ ์๋๋ฐ, ํ์ฌ DRF์์๋ ๋๋ค์๋ง ์ฌ์ฉํ์ฌ ๋ก๊ทธ์ธํ๋๋ก ์ค์ ํ ์ํ)
์ฌ๊ธฐ์ ๋ก๊ทธ์ธ ์ฑ๊ณต ํ ํ ํฐ์ ๋ฐ๊ธ๋ฐ๋ ๊ณผ์ ์์ ๋ฆฌํ๋ ์ ํ ํฐ์ ํค์ฒด์ธ์ ์ ์ฅํ๊ณ ๋์ค์ ์ ์ ๊ฐ ๋ค์ ์ ์ํ์ ๋์๋ ๋ค์ ๋ก๊ทธ์ธ ํ์ง ์๋๋ก ๊ตฌํํ์๋ค.
setItemKeyChain(userId: self.email, rft: rft!)
UserDefaults.standard.set(rft, forKey: self.email)
setItemKeyChain ํจ์๋ ๋ก๊ทธ์ธํ ์ ์ ์ ๋ฆฌํ๋ ์ ํ ํฐ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ์์ฑํ์๋ค.
func setItemKeyChain(userId: String, rft: String){
let previousQuery: [CFString: Any] = [kSecClass: kSecClassIdentity, kSecAttrAccount: userId]
let updateQuery: [CFString: Any] = [kSecValueData: rft]
let status = SecItemUpdate(previousQuery as CFDictionary, updateQuery as CFDictionary)
if status == errSecSuccess {
print("Update!")
} else {
print("Update fail")
}
}
์ถ๊ฐ์ ์ผ๋ก ์ ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด UserDefaults ๋ ์ฌ์ฉํ์๋ค. UserDefaults ๋ Redis ์ฌ์ฉ๊ณผ ์ ์ฌํ๋ค
์ ๋ ์ฝ๋๋ฅผ ํตํด ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ ํ ๋ฐ๊ธ๋ฐ์ ์ก์ธ์ค ํ ํฐ ๋ฐ ๋ฆฌํ๋ ์ ํ ํฐ์ ์ฌ์ฉ์์ ๊ธฐ๊ธฐ์ ์ ์ฅํ์ฌ ๋ก๊ทธ์์ ์์ด ๊ณ์ ์ฌ์ฉํ ์ ์๋ค.
'IOS(Swift)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[IOS/Swift] MBTI ์นด๋ ์ ํ ๊ฒ์ UI ๊ตฌํ (0) | 2022.05.22 |
---|---|
[IOS/Swift] ์ฝํ ์ธ ๊ฒ์ ์ฑ ๊ตฌํ - 3. ํ์๊ฐ์ UI ๊ตฌํ (0) | 2022.04.04 |
[IOS/Swift] ์ฝํ ์ธ ๊ฒ์ ์ฑ ๊ตฌํ - 2. ์ฑํ ๋ฐฉ UI ๊ตฌํ (0) | 2022.03.05 |
[IOS/Swift] ์ฝํ ์ธ ๊ฒ์ ์ฑ ๊ตฌํ - 1. ์ฝํ ์ธ UI ๊ตฌํ (0) | 2022.03.05 |