일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Network
- ios
- 달력
- CS
- authentication
- iphone
- dataflow
- WWDC
- swift
- withAnimation
- stateobject
- Concurrency
- SwiftUI
- 데이터최적화
- auth
- arkit
- fullscreencover
- gesture
- realitykit
- 네트워크
- combine
- Animation
- firebase
- environmentobjet
- GCD
- RxSwift
- Performance
- UIKit
- state
- ar
- Today
- Total
목록전체 글 (52)
XLOG
IAP 는 In-App-Purchase 의 약자이다.우선 인앱결제를 하기 위해선 개발자계정, 상품등록된 앱, 또한 그 앱의 앱내구입 상품 등록이 필요하다.앱스토어에 앱을 올리면 수익화 카테고리에 앱 내 구입 항목이 있다.클릭하면 내 앱에 인앱결제를 할 수 있는 항목 추가가 가능하다.위에 과정을 보면 알 수 있듯이 결제는 앱스토어 서버를 통해 이루어 진다.우리의 앱은 앱스토어 서버를 통해 Transaction 을 받아서 인앱 결제 로직을 처리한다.인앱결제 상품은 총 4가지가 있다.소모성 항목비소모성 항목자동 갱신 구독비갱신형 구독그럼 In App Purchase 의 테스트 환경을 만들어보자. 실제 공부하는 사람들은 개발자 계정 및 출시한 앱이 없을 수 있다. 하지만 StoreKit에서는 StoreKit C..
GCD VS Concurrency동기화의 대한 처리, 같은 데이터에 접근을 위해 GCD 의 경우 뮤텍스, 세마포어 등을 이용해야 하나, Concurrency 는 컴파일 에러를 발생시킨다.즉 안정성이 높다GCDworkItem 당 하나의 스레드를 할당,스레드는 결국 메모리에 할당, thread explosion., 메모리 오버헤드를 발생시킬 수 있다Context switching 이 발생하며, 블록된 스레드가 어떤 자원을 lock 하고 있을 때 데드락 발생ConcurrencyCPU 성능 이상의 스레드를 생성하지 않는다또한 await으로 중단됐을 때 컨텍스트 스위칭을 하는 것이 아닌 같은 스레드에서 다음 함수를 실행우선순위 역전Concurrency는 FIFO 가 아니기 때문에 우선순위가 높은 작업이 들어오게 ..
회사에서 근무를 하며 백엔드에서 날려주는 상황별 Error Code 는 매우 다양했다. 하지만 Client 측에선 다양한 Error Code 라도 유저가 할 수 있는 Action 은 그리 다양하지 않았다.그리고 회사에서 TCA 를 적용해서 프로젝트를 진행하였기 때문에 Error Handling 을 Composable 하게 구성할 수 없을까 고민을 했다. 그래서 Error Handling 을 위한 Redcuer 와 View 를 만들어 각 Feature 적용해야 겠다는 생각을 했다.우선 내가 throw 할 수 있는 Error Case 와 해당 Error 마다 할 수 있는 액션들의 정의가 필요했다.//// Created by Sooik Kim on 5/15/24.//import SwiftUI// API 통신..
SwiftUI 의 경우 기본 Sheet, FullScreenCover를 제공한다. 하지만 이 경우는 Sheet 의 크기가 정해져 있다.하지만 일을 하며 디자이너가 Content 의 사이즈에 맞는 Sheet 를 원했다. 그를 위해 안에 들어가는 Content 의 사이즈를 확인하여 동적으로 Sheet의 크기를 결정할 수 있는 CustomSheet 를 만들어야 겠다고 생각했다.이 때 필요한 것은 CustomSheet 내부 Content 의 사이즈를 알 필요가 있었다.그것을 위해 이전 SwiftUI Scroll value를 확인할 때 사용했던 PreferenceKey 를 사용하기로 했다.struct CalculateSize: PreferenceKey { static var defaultValue: CGSi..
기존 UIKit의 UIButton 의 경우 setTitleColor 를 통해 highlighted에 따라 색상을 변경할 수 있었다. 하지만 SwiftUI 에선 자동으로 Button에서 처리가 되기도 하지만 Custom Label의 경우는 그것이 쉽지 않다. 방법은 간단하다. ButtonStyle 을 구현하는 것이다. ButtonStyle 은 Protocol 로 Makebody 함수를 통해서 View 를 return 한다. 또한 makebody에 configuration 에는 label, isPressed 가 있다. 여기서 isPressed 가 바로 highlighted 와 비슷하다고 보면 된다. 구현은 간단하다. struct CustomButtonStyle: ButtonStyle { func makeBo..
오랜만에 포스팅이다. 두 가지 버전으로 InfinityCarousel 을 구현해볼 예정이다. 그 전에 알아야 할 것은 두가지 버전에 기본 원리는 똑같다. 만약 4가지의 ImageView를 돌리려고 가정을 해보자. let colors: [Color] = [.red, .green, .blue, .yellow] @State var currentIndex: Int = 0 GeometryReader { reader in let width = reader.size.width TabView(selection: $currentIndex) { ForEach(colors, id: \.self) { color in Rectangle() .fill(color) .frame(width: width) } } } 이런식으로 보통 ..
저번 Animation 공부한 내용을 바탕으로 Camera Shutter 를 구현해 보았다. 우선 카메라 셔터 부터 시작을 해보자. struct ContentView: View { @State var buttonTapped: Bool = false var body: some View { ZStack { Color.black ZStack { // 외각 테두리 Circle() .stroke(lineWidth: 4) .foregroundColor(.white) // 내부 원 Circle() .foregroundColor(buttonColor) .frame(width: buttonTapped ? 56 : 60, height: buttonTapped ? 56 : 60) } .frame(width: 72, heig..
기본적으로 SwiftUI 에 애니메이션을 적용하기 위해 .animation(_:value:) 를 사용하거나 withAnimation() 을 사용했다. 1. 둘의 차이 우선 이 둘의 차이에 대해 먼저 확인을 해보자. animation(_:value:) 는? 먼저 .animation() 이다. 인스턴스 메소드로 some View 를 리턴한다. view를 리턴한다는 것은 viewModifier 로 생각하면 되는 것 같다. 변화를 추적할 값 V 의 변화를 감지, 그로 인해 영향을 받는 변수들을 animation 옵션에 따라 state 의 변화를 주어 해당 View에 애니메이션을 적용한다. 그렇다면 withAnimation은 ? withAnimation은 함수이다. 결과값을 Return 한다. 즉 결과값을 리턴을..
TDD(Test Driven Development) 는 테스트 주도 개발이다. 초기 공부를 시작하다보면 자연스럽게 접하게 되는 용어이다. 왜 그런걸까? Swift 를 공부하면서 XCTest를 알기전, View를 만들고 확인하고 내부 로직을 만들어 View 붙이고를 반복했다. 메인 페이지라면 크게 문제는 없었지만 프로젝트 규모가 커지고, 내부에 view들을 확인하기 위해 simulator 를 돌리고, 원하는 페이지까지 이동해서 확인하고, 문제가 있으면 수정해서 다시 로직을 수정하고를 반복했다. 가끔은 Playground 를 만들어 테스트 해보고 프로젝트에 적용하기도 했다. 상당히 비효율적이다. XCTest 를 사용하면 이와 같은 문제를 해결할 수 있다. 각종 테스트를 할 수 있는 프레임워크다. 프로젝트 생..
오랜만에 포스팅이다. 우연히 개발자로 한발자국 발을... 아무튼 공부하며 git을 사용한 것과 일을 시작해서 사용하는 방식의 차이가 조금 많이 났었다. 가장 당황스러웠던 것은 commit을 하나로 합쳐서 Pr을 해달라는 요청을 받았다. 기존에 공부하면서 했을때는 commit의 내용보단 pr 단위로 내용을 많이 확인을 했었다... 즉 commit 기록에 대한 관리를 전혀 신경을 쓰지 않았다. 여러 협업툴을 같이 사용을 하다 보니 commit 의 내용, 이슈관리 등 commit 에 기록 또한 중요하다는 걸 느끼게 되었다. 이렇게 First Commit 이후 아주 간단한 수정이 필요해 second commit 을 날리게 되면, commit 기록이 두개로 떨어져 있을 필요가 없는 경우가 있다. 이럴때 사용하는 ..