본문 바로가기

2022/10

(23)
04. Firebase에 쓰기 메서드 구현 import Foundation import FirebaseFirestore import FirebaseFirestoreSwift class MessagesManager: ObservableObject { @Published private(set) var messages: [Message] = [] let db = Firestore.firestore() init() { getMessages() } func getMessages() { db.collection("messages").addSnapshotListener { querySnapshot, error in guard let documents = querySnapshot?.documents else { print("Error fetchin..
03. Firebase 초기화 및 Swift에서 사용하기 Firebase 초기화 하기 백엔드인 Firebase가 메시지를 저장할 수 있도록 DB를 초기화해 준다. 따로 서비스를 염두해 둔 앱이 아니기 때문에 간편하게 테스트 모드에서 시작한다. 사용하는 Region은 'asia-northeast3'로 한국에 위치해 있다. Region은 서비스의 응답 속도에 영향을 끼치는 경우가 있기 때문에 가까운 곳을 고르는 것이 좋다. Region은 Firestore를 초기화 한 이후 변경할 수 없으므로 잘 고르도록 하자. Cloud Firestore 위치 | Firebase 2022년 10월 18일에 오프라인과 온라인으로 진행될 Firebase Summit에 참여하세요. Firebase로 앱을 빠르게 개발하고 안심하고 앱을 출시하며 손쉽게 확장하는 방법을 알아보세요. 지금 ..
02. Firebase 연결하기 Firebase 프로젝트 생성 Firebase에 회원가입을 하고, 'Get started'를 선택한다. 프로젝트를 생성하고, 이름을 지정한 뒤 지금은 필요 없는 Google Analystic은 비활성화한다. 해당 기능은 Google의 분석 툴로, 실제 서비스라면 필요할지 모르겠지만 지금은 상관없다. 앱에 Firebase 추가 생성된 프로젝트의 Console로 이동해 표시된 'iOS' 버튼을 선택한다. 앱 등록에서는 Apple 번들 ID를 반드시 입력해 줘야 한다. Xcode 프로젝트의 Bundle Identifier를 입력해 주면 된다. 이외는 선택사항으로 입력하지 않아도 무방하다. 그다음 GoogleService-Info.plist 파일을 다운로드하여 안내대로 프로젝트 파일 안에 던져 넣고 다음 단계로..
[~2022.08.31] 일상, 인사동, 광화문 (Ricoh GR 3x, iPhone 13 mini) 서론 사용한 카메라는 Ricoh GR3x와 iPhone 13 mini 아이폰으로 촬영한 사진이 월등히 적기 때문에 별도로 기재해 두겠다. 보정은 없음. 본론 8월 14일 가산 | INC Coffee 가산디지털단지역에서 도보로 조금 걸으면 나오는 대형 카페. Whale이 주말에 수업이 생겨 동선에 유리한 곳으로 옮겨 봤다 냉방도 시원했고, 대형인 만큼 층마다, 구역마다 테마나 분위기가 다르다는 점이 좋다. 재방문 의사는 매우 높으나 빵이 맛있어서 돈을 잔뜩 쓰게 된다는 단점이... 편한 의자는 없어서 오래 앉아서 작업을 하거나 책을 읽기엔 부적합하다. 8월 24일 신촌 | 라구식당 후배가 점심을 사준다며 불러낸 신촌... 끝까지 응석을 받아 줬어야 하는데 내가 그런 어른이 못돼 오히려 내가 짜증도 냈었지...
01. 인터페이스 디자인 더미 데이터 import Foundation struct Message: Identifiable, Codable { var id: String var text: String var received: Bool var timestamp: Date } 실제로 Firebase에 연결되지 않은 상태이기 때문에, 화면에 출력할 더미 데이터들이 필요하다. 더미데이터들은 Message 구조체로 이뤄져 있고, 해당 구조체는 열거와 형식 변환이 자유롭도록 Identifiable 프로토콜과 Codable 프로토콜을 채용한다. TitleRow TitleBar는 HStack을 사용해 3개의 덩어리로 구성돼 있다. HStack의 spacing 파라미터에 20을 전달해 Embed 되는 View들의 간격을 20pt로 지정했다. As..
00. 시작하며 백엔드 물론 SQL이나 Oracle을 사용해 직접 구현하는 능력자들도 많다는 걸 알고 있다. 문제는 내가 그럴 재량이 없다는 것. 이름을 들어본 서비스들과 써 본 경험이 있는 서비스들이 존재한다. 간단하게 소개하고 왜 선택했는지 이유를 적어 둔다. AWS 클라우드 서비스 | 클라우드 컴퓨팅 솔루션| Amazon Web Services 개발자, 데이터 사이언티스트, 솔루션스 아키텍트 또는 AWS에서 구축하는 방법을 배우는 데 관심이 있는 모든 사용자용 무료 온라인 교육 AWS 전문가가 구축한 500개 이상의 무료 디지털 교육 과정 aws.amazon.com 가장 보편적인 백엔드 서비스로 규모도 가장 크고, 자료도 가장 많다. 어쩌면 가장 도움이 되는 경험일 수도 있겠지만, 여기에 삽질을 하기엔 개인적인 우..
21. Animation Animation Apple Developer Documentation developer.apple.com struct AnimationView: View { @State private var position = CGPoint.zero var body: some View { VStack { Circle() .foregroundColor(.blue) .frame(width: 50, height: 50) .position(position) .offset(x: 50, y: 50) .animation(.easeIn) Spacer() Button(action: { self.position = self.position == .zero ? CGPoint(x: 300, y: 300) : .zero }, label: {..
20. Image & SFSymbol & AsyncImage Image Apple Developer Documentation developer.apple.com struct ColorImageView: View { var body: some View { Image("sampleBG") } } Image View는 말 그대로 이미지를 표시하는 View다. 정확히는 Labeled Image와 Unlabeled Image가 존재하며, 같은 View를 생성하지만 전달하는 파라미터가 다르다. 보통은 생성자에 Asset에 추가한 이미지의 이름을 전달해 사용한다. 이미지는 실제 크기를 사용하지만 modifier를 사용해 자유롭게 변경할 수 있다. struct ColorImageView: View { var body: some View { Image("sampleBG") .re..
19. Color & Material Color Apple Developer Documentation developer.apple.com struct ColorImageView: View { var body: some View { VStack { Text("This") .foregroundColor(Color(uiColor: .systemOrange)) .fontWeight(.black) Text("is") .foregroundColor(.cyan) .fontWeight(.black) Text("Color") .foregroundColor(Color(red: 0.4, green: 0.2, blue: 0.7)) .fontWeight(.black) } } } Color 그 자체로도 하나의 View의 역할을 하지만, 보통은 다른 View의 Mod..
18. Stepper & Picker & Date Picker & Color Picker Stepper Apple Developer Documentation developer.apple.com struct ControlsView: View { @State private var stepperVal = 0 var body: some View { VStack { Spacer() Image(systemName: "gear") .resizable() .frame(width: CGFloat(stepperVal) * 5, height: CGFloat(stepperVal) * 5, alignment: .center) .scaledToFit() Spacer() Stepper() { Label { Text("value is \(stepperVal) and real gear change to \(stepperV..