전체 글
[Xcode] SPM Package 내부에서 CustomFont 사용하기
SDK작업중 Font를 SPM Package에서 사용하기 위한 방법과 삽질을 남겨봅니다. SPM Package의 구조입니다. Package하위의 여러 모듈중 SDKCommon이라는 모듈의 일부입니다. SDK 구조 가정ClampSDK - ClampSDKAuth // 모듈 - ClampSDKChat // 모듈 - ClampSDKCommon // 모듈 ㄴ Resources // ClampCommon모듈의 하위 폴더 ㄴ Fonts // Resources 폴더의 하위 폴더 ㄴ ttf파일 1. Package 파일에 Resources를 정의해줍시다 targets: [ .target( ..
[iOS] DynamicFramework
1. Framework, Library- Library: Code와 Data가 모인 하나의 모듈- Framework: Library를 포함하는 하나의 패키지로 캡슐화한 디렉토리ex) Framework = Library + Nib + Resources(Image, String, Header) 2. DynamicFramework- 컴파일된 바이너리 파일이 stack의 Bundle영역에 존재하여 어플리케이션 코드에서 스택 영역을 참조하여 사용- 동적으로 연결되므로 전체를 빌드하지 않아도 프레임워크를 사용 가능- Dynamic Framework는 공유메모리를 사용같은 DynamicFramework를 사용하는 앱 들이 있다면 해당 코드는 메모리에 한 번만 로드되어 여러 앱이 공유DynamicFramework는 앱..
[iOS] Decorator 패턴을 활용한 에러 처리
디자인 패턴중 구조패턴인 데코레이터 패턴을 활용한 에러처리 방법입니다. 데코레이터 패턴데코레이터 패턴은 디자인패턴중 구조패턴에 속하는 패턴입니다.Wrapper 패턴이라고도 불립니다. 데코레이터 패턴은 새로운 행동을 정의한 Wrapper내부에 Wrapper를 넣어서 행동들을 해당 겍체들이 담당하도록 하는 구조 패턴입니다. 마트료시카라는 러시아 인형을 예시로 들면 적합할것 같습니다.이 인형 안에 인형이, 그 인형 안에 또 인형이 들어있는 구조입니다이 인형 하나가 Wrapper가 되고 그 Wrapper가 또 Wrapper를 가지고 있는 구조입니다. 각자의 Wrapper는 각자의 역할을 담당합니다. 데코레이터 패턴에 대해서는 좋은 설명이 많은 글이 많으니 깊게 설명하지는 않겠습니다. 데코레이터 패턴의 특징은 ..
[SwiftUI] - 자식뷰에 데이터를 어떻게 전달해야할까 그리고 뷰 갱신이 이루어 질까? with. MVVM
회사 프로젝트는 정말 다양한 기술로 구성되어 있습니다. 많은 기술을 시도하고 공부하며 적용하고 더 좋은 구조를 찾아 발전하고 성장해나갑니다. UIKit, RxSwift, ReactorKit, RxFlow, SwiftUI, Combine, Asycn Await, MVVM, MVC등 많은 기술을 거쳐왔습니다.최근에는 SwiftUI와 MVVM을 주로 적용시켜왔습니다. UIKit을 사용 할 때에는 MVVM-InOut패턴과 RXSwift을 적용해 어느정도의 데이터 흐름을 파악하기 용이했습니다.Input을 정의해 이벤트가 어디서 시작되는지 알 수 있었고 스트림을 통해 방출되는 데이터는 Output을 활용해 뷰가 구독하고 갱신을 했습니다. 하지만 SwiftUI로 넘어오며 @Binding을 활용해 데이터의 양방향 흐름..
[iOS Swift ] AES-256 암호화
회사 프로젝트에서 AES-256암호화로 웹과 데이터를 주고받아야 하는 일이 있었다. 서버: App으로 광고 전달App: 특정 조건에 해당하는 경우 사용자 정보를 암호화하고 내부 규정에 맞춰 웹으로 이동시키는 작업이 경우 웹으로 이동 시 사용자 정보를 함께 전달해야 하므로 AES-256으로 암호화 하고 서버는 웹으로 전달받은 내용을 복호화 하여 데이터 처리 우선 AES암호화는 양방향 암호화입니다. 단방향 암호화: 한 번 암호화하면 원래 데이터로 되돌릴 수 없는 암호화 방식입니다. 주로 해시함수를 사용하여 데이터를 특정 길이의 고정된 데이터로 변환합니다 대표적으로 SHA-256기법이 있습니다. 복호화가 불가능하다는 특징이 있으며 주로 비밀번호 저장, 파일 무결성 체크에 사용됩니다.양방향 암호화: 암호화된 ..
[SwiftUI] ForEach가 View를 업데이트 하는 방법과 @StateObject를 사용할 때 문제점(그리고 그 뒷 이야기..)
++ 맨 아래를 참고해주세요 SwiftUI를 사용할 때 ForEach를 자주 사용합니다. 저는 회사에서 채팅 서비스를 개발하고있습니다. List를 사용할 수 있지만 List를 사용하는 방법보단ForEach + LazyVStack + ForEach를 사용하는 방법이 더욱 다양한 기능을 적용시키기 좋아서 후자를 선택해 사용하고있습니다. ForEach와 StateObject를 사용할 때에는 몇 가지 문제점이 있습니다.우선 ForEach는 View의 id를 기준으로 뷰를 구분하고 업데이트합니다.물론 @Published 프로퍼티가 바뀌게되어도 뷰를 업데이트 하긴 하죠. 하지만 @StateObject를 사용해 ForEach를 사용한다고 가정할 경우 뷰 업데이트에 대한 문제가 생길 수 있습니다. 만약 여러분이 채팅어..
[SwiftUI] SwiftUI는 뷰를 어떻게 구분하고 업데이트 하는가.(Identity, Lifetime)
SwiftUI는 뷰를 어떻게 구분하고 업데이트할까요? 또 Identity, Lifetime등 용어는 무엇일까요? 오늘은 이를 정리해보겠습니다. 우선 이를 알기위해 알아야 할 사전 지식이 있습니다. 동등성(equality)와 동일성(Identity)입니다. 동등성(Equality) 이 둘은 같을까요? Equatable로 비교하면 이 둘은 같습니다. 이렇게 상태만을 비교하면 이 둘은 같다고 할 수 있습니다. 동일성 한 clamp가 있다고 가정해봅시다. 우리는 이름도 같고, 나이도 같기 때문에 같은 clamp라고 생각 할 수 있습니다. 하지만 Equatable로 비교하면 다르다고 나옵니다. 상태가 다르니까요 만약 우리가 저 둘을 동일한 clamp라고 생각하려면, 즉 같은 clamp로 "식별"하려면 무언가가 필..
[iOS] Alamofire 네트워크 레이어 설계2. 토큰관리(Interceptor)
Alamofire에서 토큰 갱신, 에러 처리등을 효율적으로 하기위해 제공해주는 Interceptor라는 프로토콜이 존재합니다. Interceptor는 서버에 요청을 보내기 전에, 중간에 가로채서 어떠한 작업을 수행할 수 있게 해주고 요청의 결과로 Error가 발생한 경우 요청을 다시 할 것인지를 처리할 수 있게 해줍니다. - adapt(): API호출 전에 URLRequest를 가로채서 어떤 작업을 할 수 있도록 해주는 메서드 - retry(): API호출의 결과로 Error가 발생한 경우 요청을 다시 할 것인지 처리하도록 해주는 메서드 Alamofire가 제공하는 RequestIntereptor의 본문은 다음과 같습니다. 이를 그림으로 구조를 그려보면 아래와 같습니다. 만약 토큰을 활용해 서버와 통신하..
[iOS] 커스텀 액티비티 인디케이터 제작 feat. RxSwift
커스텀 액티비티 인디케이터 iOS 앱 개발에서 사용자에게 작업이 진행중임을 알리는 것은 중요합니다. 기본 제공되는 액티비티 인디케이터가 존재하지만 때론 앱의 디자인과 더 잘 어울리는 커스텀 액티비티 인디케이터를 만들어야 할 경우가 많습니다. 네트워크 통신을 진행할 때 통신중 또는 로딩중인 경우 또는 어떤 작업(오래 걸리는 작업)을 진행중일 경우 사용자에게 알려줘야합니다. 그렇지 않으면 사용자는 앱이 멈춘건지, 로딩중인건지, 기다려야하는지 판단하기 힘듭니다. 이럴 때 ActivityIndicator는 사용자에게 프로그램이 정확히 작업중이라는것을 알 수 있게 해줍니다. 이런 커스텀 액티비티 인디케이터를 어떻게 만들었고 네트워킹과 어떻게 연결하여 사용하였는지 기록해보겠습니다. 앞서 해당 프로젝트에서는 Alam..