본문 바로가기

프로젝트/Twitter Clone App (w∕Firebase)

(27)
16. 코드 가독성 개선 코드 가독성 개선 UserService UserService > fetchUsers func fetchUsers(completion: @escaping([User]) -> Void) { var users = [User]() Firestore.firestore().collection("users").getDocuments { snapshot, _ in guard let documents = snapshot?.documents else { return } documents.forEach { document in guard let user = try? document.data(as: User.self) else { return } users.append(user) } completion(users) } } f..
15. 기능구현 #4 기능구현 #4 ExploreView ExploreView | UserService > fetchUser struct UserService { func fetchUser(withUid uid: String, completion: @escaping(User) -> Void) { Firestore.firestore().collection("users").document(uid).getDocument { snapshot, _ in guard let snapshot = snapshot else { return } guard let user = try? snapshot.data(as: User.self) else { return } completion(user) } } } UserService는 현재 fetchUs..
14. 버그 수정 #1 버그 수정 #1 Authentication, NavigationView 중복 표시 문제 Authentication | AuthViewModel > login before func login(withEmail email: String, password: String) { Auth.auth().signIn(withEmail: email, password: password) { result, error in if let error = error { print("debug: failed to signin \(error.localizedDescription)") return } guard let user = result?.user else { return } self.userSession = user print(..
13. DB와 연결하기 #2 DB와 연결하기 #2 프로필 사진 표시하기 프로필 사진 표시하기 | Kingfisher import 하기 Kingfisher GitHub - onevcat/Kingfisher: A lightweight, pure-Swift library for downloading and caching images from the web. A lightweight, pure-Swift library for downloading and caching images from the web. - GitHub - onevcat/Kingfisher: A lightweight, pure-Swift library for downloading and caching images from the web. github.com URL을 사용해..
12. DB와 연결하기 #1 DB와 연결하기 #1 Link UserData to SideMenu Link UserData to SideMenu | AuthViewModel class AuthViewModel: ObservableObject { @Published var userSession: FirebaseAuth.User? @Published var didAuthenticateUser = false @Published var currentUser: User? private var tempUserSession: FirebaseAuth.User? private let service = UserService() init() { self.userSession = Auth.auth().currentUser fetchUser() } 현재 접..
11. 기능 구현하기 #3 기능 구현하기 #3 UserInformation UserInformation | UserModel struct User: Identifiable, Codable { @DocumentID var id: String? let username: String let fullname: String let profileImageUrl: String let email: String } Firebase에서 받아와 사용할 수 있도록 User 데이터에 대한 모델을 구성한다. UserInformation | UserService import Firebase import FirebaseFirestoreSwift Firebase에서 사용자의 정보를 받아오기 위한 함수를 작성한다. 이를 위해 Firebase와 FirebaseFi..
10. 기능 구현하기 #2 기능 구현하기 #2 프로필 이미지 설정하기 ImagePicker SwiftUI를 사용하는 앱에서는 iOS16 혹은 동세대의 OS 이상을 사용하는 경우 PhotosUI를 사용하도록 개선이 이루어졌다. 물론 iOS16 이상을 대상으로만 서비스를 한다면 문제가 없겠지만 세상은 그리 녹록지 않기 마련이다. 이전까지는 PHPickerViewController나 UIKit의 UIImagePickerController를 사용해야만 한다. 영상에서는 UIImagePickerController를 사용하는 방식을 사용했으므로 이에 대해 나열한다. Utils 폴더를 하나 만들어 주고, 그 안에 ImagePicker를 구현한다. import SwiftUI struct ImagePicker: UIViewControllerRep..
09. 기능 구현하기 #1 기능 구현하기 #1 Firebase Import & Login Function Firebase Import 02. Firebase 연결하기 Firebase 프로젝트 생성 Firebase에 회원가입을 하고, 'Get started'를 선택한다. 프로젝트를 생성하고, 이름을 지정한 뒤 지금은 필요 없는 Google Analystic은 비활성화한다. 해당 기능은 Google의 분석 툴로, chillog.page 기본적인 방법은 위와 같다. 다만 사용하려는 모듈은 조금 다른데 아래와 같다. 회원가입과 로그인 기능을 위한 'FirebaseAuth', DB 접근을 위한 'FirebaseFirestore'와 'FirebaseFirestoreSwift', 이미지 등의 큰 데이터를 저장하고 불러 올 'FirebaseSt..
08. 기본 UI 구현하기 #8 기본 UI 구현하기 #8 CustomTextField & AuthHeaderView & RegistrationView CustomTextField 더보기 Source VStack(spacing: 40) { TextField("Email", text: $email) SecureField("Password", text: $password) } .padding(.horizontal, 32) .padding(.top, 44) LoginView에서 사용했던 두 개의 TextField는 이미지와 TextField 혹은 SecureField, Divider의 조합으로 이루어져 있다. 같은 UI가 동일하게 RegistrationView에서도 사용되기 때문에 재사용을 용이하게 하기 위해 모듈화 한다. 더보기 Source..
07. 기본 UI 구성하기 #7 기본 UI 구성하기 #7 LoginView 계정 로그인에 사용할 UI를 구성한다. LoginView | Header Login 화면의 상단에 해당하는 부분이다. 푸른색의 배경과 두 줄의 TextView로 이루어져 있다. 더보기 Source VStack(alignment: .leading) { HStack { Spacer() } Group { Text("Hello.") Text("Welcom Back") } .font(.largeTitle) .fontWeight(.semibold) } .frame(height: 260) .padding(.leading) .background(Color(.systemBlue)) .foregroundColor(.white) .clipShape(RoundedShape(corne..