swiftui 에서 firebase를 활용해 다음과 같이 사용자별로 이메일, 객체 배열을 저장했다. 이후, 구글을 통해 객체 배열을 삭제하는 함수를 작성했는데, 화면에서는 함수가 제대로 작동하는 것처럼 나왔지만, 실제 firebase에서는 데이터가 일부만 삭제되는 현상이 발생했다. 이러한 현상은 Date 타입을 사용하는 경우 발생한다고 한다. 현재 Package model 코드는 다음과 같다. struct Packages: Codable, Hashable { var timeStamp: Date var trackCompany: String var trackNumber: String var setTrackNumber: [String: Any] { return [ "timeStamp": self.timeSta..
회사는 홈페이지,이메일,API,스마트폰 어플리케이션등의 방법으로 수집 및 이용 목적에 따라 필요한 최소한의 고객정보를 수집하고 이용합니다. 수집하는 개인정보 항목과 수집 및 이용 목적은 다음과 같습니다. 1.1 회원 가입[필수] ① 수집항목 - [필수]아이디(이메일),비밀번호 - [선택]오픈인증 서비스(카카오, 애플 등)의 회원키 ② 수집 및 이용 목적 - 고객 본인 확인 - 택배 서비스(배송조회, 택배예약) 이용정보 제공 및 푸시메세지 제공 1.2 쇼핑다이어리[선택] ① 수집항목 - [필수] 구매 상품 혹은 구매 예정 상품의 택배사명, 운송장번호, 상품 정보, 주문정보 ② 수집 및 이용 목적 - 배송정보 제공 - 쇼핑몰 불러오기 기능개선 - 이용자 구매 성향에 기반한 맞춤 광고 게재 - 이벤트 및 광고..
로그인, 회원가입 기능을 수정하는 작업을 진행하게 되었다. 해당 View를 구성하는 데 있어서 이메일 형식, 비밀번호 형식이 아니거나 비밀번호와 비밀번호 확인이 동일하지 않을 때 에러를 출력하는 것은 어렵지 않았다. 그러나 firebase와 연동해 해당 이메일이 이미 존재하거나, 이메일을 잘못 입력했을 때 이를 view에 보이게 하는 문제에 직면했다. 우선 이메일 형식, 비밀번호 형식을 구분하는 함수는 다음과 같다.(해당 함수는 다른 여러 곳에도 소개되어 있다) //이메일 형식 확인 함수 func checkEmail(str: String) -> Bool { let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}" return NSPredic..
firebase의 firestore를 이용하여 사용자를 등록하고 사용자의 이메일과 택배 번호, 택배 회사에 관한 데이터를 입력시키는 작업을 진행했다. 해당 작업을 진행하면서 카카오, 애플, 이메일 회원가입을 각각 진행할 때 이메일이 같은 경우에 어떤 식으로 해당 이메일들을 구분해야 하는가에 대한 문제가 발생했다. 이 문제점은 아래 회원가입과 로그인 코드와 같이 Auth.auth().createUser(withEmail: email + "2", password: password)를 활용했다. 각각 로그인, 회원가입 시에 이메일 뒤에 구분할 수 있는 다른 문자열을 넣는 방식을 채택했다. 그리고 Create, update, delete는 firebase의 문서들을 참고하여 해결할 수 있었지만, read의 경우..
firebase에서 제공하는 database에는 Firestore database와 Realtime database가 존재한다. 각자의 장단점이 존재하지만 이 글은 Firestore를 활용해 데이터를 저장하는 방법에 대해서 쓰도록 하겠다. 현재 작업중인 프로젝트에서는 사용자별로 사용자가 추가한 택배송장번호와 택배회사를 firebase에 저장을 해야했다. 우선 회원가입을 하면 다음과 같이 users collection에 user.uid document를 설정하고, 사용자의 이메일을 넣는다. 초기에는 송장번호를 입력하지 않았으므로 nil값을 넣어주었다. EmailAuthVM.swift class EmailAuthVM: ObservableObject { // 사용자 Create 완료 @AppStorage("l..
프로젝트를 진행하던 중 사용자의 배송 물품을 조회하는 목록을 만들어야 했다. 우선 화면은 다음과 같다. 처음에는 단순히 따로 custom item을 만들지 않고 swift에서 기본으로 제공하는 list와 onDelete등을 사용해서 해당 기능을 구현하고자 했다. 그러나 onDelete()를 활용해서 삭제를 구현하면 각 item의 끝에서 삭제하기 버튼이 등장하지 않고, 리스트의 끝에서 삭제하기 버튼이 나타나는 현상과 여러 UI를 구성하는 데 있어서 제약이 있었다. 그래서 custom item을 활용해 해당 기능을 구현하기로 했다. MainView struct PackListTabView: View { @StateObject var packInfoDatas = PackInfoViewModel() var bo..
거의 모든 앱 서비스에서는 설정 화면이 필요로 하는데 설정 화면을 개발해야 되는 일이 있어서 이를 토대로 짧게 정리하고자 한다. 우선, 개발하고자 하는 화면은 다음과 같다. 아무래도 반복되는 모양의 버튼이 많다보니 Struct를 활용해 해당 버튼들을 만들었다. 화면을 보면 버튼이 크게 3종류(화살표, 토글, 버젼)로 구분되어있어 enum을 활용해 최대한 코드를 줄이려고 노력했다. 코드는 다음과 같다. 1. systemTabView var systemTabView: some View { VStack { Text("설정") .font(FontManager.title2) VStack(spacing: 10) { SystemButtonView(buttonType: .arrow, text: "계정", email: ..
현재 진행중인 택배 조회 앱을 개발하던 중 다음과 같은 메인 화면을 개발하게 되었다. 화면 구성을 보면 1. 하단에 탭 버튼을 클릭해 메인 화면, 택배 리스트 화면, 설정 화면으로 이동 가능 2. 좌우 스크롤을 이용해 현재 택배들의 위치 표시(애니메이션 활용) 3. 기타 정보들 표시 정도로 이루어져 있다. 우선 하단 탭 버튼을 이용해 화면을 이동하는 것은 팀원이 알려준 자료를 활용해 쉽게 구현할 수 있었다. struct MainView: View { var body: some View { TabView { mainTabView .tabItem{ Image(systemName: "house") .environment(\.symbolVariants, .none) } packListTabView .tabIte..