헬스킷을 프로젝트에 적용하게 되면서 고민했던 점들을 한번 작성해볼까 합니다. 헬스킷 자체만으로도 많은 API를 가지고 있는데다가 비즈니스 로직까지 합쳐지며 코드 부담이 꽤나 커졌는데요, 이를 풀어갔던 과정을 공유해보겠습니다. 요구사항 제가 기획했던 서비스에서 필요했던 요구사항을 간단히 정리해보자면 다음과 같습니다. 사용자의 수면, 심박, 활동 데이터를 하루 단위로 정리해서 (서버에) 저장한다. 이때, 애플워치 데이터를 우선시한다. 세부적으로 필요한 데이터(분당심박평균, 총수면시간 등등 ..)들을 수집할 수 있는지는 문서와 실기기 테스트로 어느정도 검증한 상태였기 때문에 어려울게 없어보였는데요, 막상 작업을 시작해보니 난관이 있었습니다. 먼저 건강데이터들은 헬스킷 데이터베이스에 저장이 됩니다. 그래서 단순..
우연히 GraphQL을 써볼 기회가 생겼는데요, Apollo라는 라이브러리를 이용해 GraphQL을 적용해보려고 합니다! https://www.apollographql.com/docs/ios/get-started Getting Started with Apollo iOS The Apollo iOS SPM package includes the Codegen CLI as an executable target. This ensures you always have a valid CLI version for your Apollo iOS version. To simplify accessing the Codegen CLI, you can run the included apollo-cli-install SPM plugi..
[iOS] FCM으로 Push Notification (푸시 알림) 구현하기 FCM(Firebase Cloud Messaging)같은 경우는 공식문서와 설정 튜토리얼이 정말 잘 되어있어서 공식 문서를 따라가시는 것도 좋을 것 같습니다! I. Key 발급 1. 우선 먼저 Apple Developer Member Center에서 Keys에 들 dokit.tistory.com 이번엔 FCM에 이어서 로컬에서 푸시를 구현해보려고합니다. 별도의 토큰이 필요하지 않기 때문에 훨씬 간단해요! 알림 허용 받기 우선 사용자에게 알림 허용 권한을 받야야합니다. AppDelegate에서 설정하기 import UserNotifications class AppDelegate: NSObject, UIApplicationDeleg..
NavigationStack은 path라는 State 변수에 데이터를 push 함으로써 화면전환을 하는데요, 이때 .navigationDestination이라는 메서드에서 push할 뷰의 정보를 받습니다. 그런데 여러 종류의 View를 push하려면 어떻게 해야할까요? 같은 뷰, 다른 데이터라면? - Struct 같은 뷰에 각각 다른 데이터를 넣어야한다면 struct를 사용할 수 있습니다. 공식 예제에서 나오는 방법이죠! struct ViewContent: Hashable { let number: Int let content: String } 이때 Hashable 프로토콜을 준수해야하더라구요. 이 경우에는 String이라는 프리미티브 타입이 있어서 따로 구현하지 않아도 됐는데요, 만약 다른 struct ..
분리를 결심한 계기 현재 프로젝트에서 ViewModel은 Container View(페이지 단위)와 1:1로 사용하고 있었습니다. 그런데 한 컨테이너뷰에 기능이 많아질 때, 뷰는 컴포넌트를 분리해가며 크기를 유지시킬 수 있었는데, 뷰모델은 계속해서 커지는 문제가 발생했습니다. 현재 Combine을 이용해서 작업하고 있는데 뷰모델이 관리하는 상태가 너무 많아져 어떤 변수가 어디에 쓰이는지 구분하기가 헷갈려졌고, 바인드 코드 또한 관리하기가 어려워졌습니다. 이에 여러 방법을 생각해보다 뷰모델을 분리하기로 결심했습니다. 문제의 뷰모델 import Foundation import Combine class SignupViewModel: ObservableObject { // MARK: - Dependency le..
문득 Task의 사용 방법을 자세히 모르고 있는 것 같아 Swift Concurrency 공식 문서를 정독해보게 되었습니다. https://docs.swift.org/swift-book/documentation/the-swift-programming-language/concurrency/ Documentation docs.swift.org 이건 영문이고 https://bbiguduk.gitbook.io/swift/language-guide-1/concurrency 동시성 (Concurrency) - Swift 한 동시성 도메인에서 다른 동시성 도메인으로 공유될 수 있는 타입을 전송 가능 타입 (sendable type) 이라고 합니다. 예를 들어, 액터 메서드로 호출될 때 인수로 전달되거나 작업의 결과로..
에러 상황 유닛 테스트 타겟을 추가하고 ViewModel 테스트를 위해 뷰모델을 인스턴스화 하려고 하는데 컴파일러가 뷰모델을 못 찾고 있습니다. 해결 방안 @testable import [프로젝트 이름]을 추가해주면 해결됩니다. private var viewModel: AtchI.AnyViewModel! 이후 이렇게 프로젝트 명으로 더 명확하게 접근할 수도 있습니다. (import 타겟이 하나거나 다른 타겟에 같은 클래스명이 없다면 프로젝트명. 은 필수로 작성하지 않아도 됩니다.) +) XCTest import 문제 저는 프로젝트 생성 당시 테스트 타겟을 추가하지 않아서인지 라이브러리 import가 되어있지 않았습니다. Target > Build Phases > Link Binary With Librar..
HealthKit에서는 데이터를 처리할 때 각각 용도에 맞게 정의된 타입으로 처리하는데요. 이에 대해 정리해보았습니다. DataTypes (표현 방식 분류) 건강 데이터의 표현 방식을 식별하는데 사용됩니다. let bloodType = HKObjectType.characteristicType(forIdentifier: .bloodType) let caloriesConsumed = HKObjectType.quantityType(forIdentifier: .dietaryEnergyConsumed) let sleepAnalysis = HKObjectType.categoryType(forIdentifier: .sleepAnalysis) 이처럼 각 데이터를 표현하기 적절한 type과 구체적인 데이터 종류인 Ide..
- Total
- Today
- Yesterday
- Bloking/Non-bloking
- programmers
- Architecture Pattern
- ios
- Swift Concurrency
- healthkit
- Flutter
- MVC
- MVI
- RX
- 리액티브 프로그래밍
- Flux
- 아키텍쳐 패턴
- swift
- GetX
- notion
- 비동기/동기
- SWM
- 프로그래머스
- coordinator pattern
- TestCode
- combine
- 노션
- SwiftUI
- 소프트웨어마에스트로
- MVVM
- design pattern
- DocC
- reactive programming
- 코디네이터 패턴
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |