IOS
[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는 각자의 역할을 담당합니다. 데코레이터 패턴에 대해서는 좋은 설명이 많은 글이 많으니 깊게 설명하지는 않겠습니다. 데코레이터 패턴의 특징은 ..
[iOS Swift ] AES-256 암호화
회사 프로젝트에서 AES-256암호화로 웹과 데이터를 주고받아야 하는 일이 있었다. 서버: App으로 광고 전달App: 특정 조건에 해당하는 경우 사용자 정보를 암호화하고 내부 규정에 맞춰 웹으로 이동시키는 작업이 경우 웹으로 이동 시 사용자 정보를 함께 전달해야 하므로 AES-256으로 암호화 하고 서버는 웹으로 전달받은 내용을 복호화 하여 데이터 처리 우선 AES암호화는 양방향 암호화입니다. 단방향 암호화: 한 번 암호화하면 원래 데이터로 되돌릴 수 없는 암호화 방식입니다. 주로 해시함수를 사용하여 데이터를 특정 길이의 고정된 데이터로 변환합니다 대표적으로 SHA-256기법이 있습니다. 복호화가 불가능하다는 특징이 있으며 주로 비밀번호 저장, 파일 무결성 체크에 사용됩니다.양방향 암호화: 암호화된 ..
[iOS] Alamofire 네트워크 레이어 설계2. 토큰관리(Interceptor)
Alamofire에서 토큰 갱신, 에러 처리등을 효율적으로 하기위해 제공해주는 Interceptor라는 프로토콜이 존재합니다. Interceptor는 서버에 요청을 보내기 전에, 중간에 가로채서 어떠한 작업을 수행할 수 있게 해주고 요청의 결과로 Error가 발생한 경우 요청을 다시 할 것인지를 처리할 수 있게 해줍니다. - adapt(): API호출 전에 URLRequest를 가로채서 어떤 작업을 할 수 있도록 해주는 메서드 - retry(): API호출의 결과로 Error가 발생한 경우 요청을 다시 할 것인지 처리하도록 해주는 메서드 Alamofire가 제공하는 RequestIntereptor의 본문은 다음과 같습니다. 이를 그림으로 구조를 그려보면 아래와 같습니다. 만약 토큰을 활용해 서버와 통신하..
[iOS] 커스텀 액티비티 인디케이터 제작 feat. RxSwift
커스텀 액티비티 인디케이터 iOS 앱 개발에서 사용자에게 작업이 진행중임을 알리는 것은 중요합니다. 기본 제공되는 액티비티 인디케이터가 존재하지만 때론 앱의 디자인과 더 잘 어울리는 커스텀 액티비티 인디케이터를 만들어야 할 경우가 많습니다. 네트워크 통신을 진행할 때 통신중 또는 로딩중인 경우 또는 어떤 작업(오래 걸리는 작업)을 진행중일 경우 사용자에게 알려줘야합니다. 그렇지 않으면 사용자는 앱이 멈춘건지, 로딩중인건지, 기다려야하는지 판단하기 힘듭니다. 이럴 때 ActivityIndicator는 사용자에게 프로그램이 정확히 작업중이라는것을 알 수 있게 해줍니다. 이런 커스텀 액티비티 인디케이터를 어떻게 만들었고 네트워킹과 어떻게 연결하여 사용하였는지 기록해보겠습니다. 앞서 해당 프로젝트에서는 Alam..
[iOS] - UICollectionView Compositional Layout
앱스토어 앱. CompositionalLayout을 사용하지 않는다면 테이블뷰 내부의 셀 내부의 컬렉션뷰 내부의 테이블뷰... 이런 복잡한 레이아웃을 보완하기위해 Compositional Layout의 등장. 전체 하나의 CollectionView로 섹션별 다양한 레이아웃을 적용 가능 구성 하나의 Layout 내부의 여러 Section이 포함되며 Section은 여러 Group을 포함한다. Group은 Item을 갖고있다. 이들의 크기를 지정해주면 된다. CollectionView의 item 사이즈를 정하는 방법(NSCollectionLayoutDimension) .absolute - 고정 크기 .estimated - 런타임에 크기가 정해지는경우(예상크기) .fractional - 비율(컨테이너에 대한 ..
[iOS] Alamofire 네트워크 레이어 설계1. 에러처리 (feat. Rx)
https://ios-development.tistory.com/731 [iOS - swift] 1. Alamofire 사용 방법 - Network Layer 구현 (Moya 프레임워크처럼 사용하는 방법) 1. Alamofire 사용 방법 - Network Layer 구현 (Moya 프레임워크처럼 사용하는 방법) 2. Alamofire 사용 방법 - 토큰 갱신 방법1 (Interceptor, adapt, retry) 3. Alamofire 사용 방법 - 토큰 갱신 방법2 (AuthenticationCredential, ios-development.tistory.com 해당 게시글을 토대로 구현해본 네트워크 레이어를 기록해봅니다. 부족한 점이 있다면 알려주시면 감사합니다. 1. 에러 처리 * HTTP통신은..
[iOS] - IntrinsicContentSize, InvalidateIntrinsicContentSize()
IntrincContentSize 본질적인 컨텐츠 크기 UILabel, UIButton을 autoLayout으로 구현할 때 Width, Height를 지정해주지 않아도 에러가 발생하지 않는 이유는 IntrinsicContentSize프로퍼티에서 컨텐츠의 크기를 계산해주기 때문입니다. UILabel, UIButton, UIProgressView 모두 루트뷰의 leading, top spacing만을 주었습니다. 모두 위치만 지정해주고 크기를 지정하지 않았습니다. UILabel, UIButton은 모두 IntrinsicContentSize프로퍼티가가 Width, Height를 계산해주어서 크기를 정할 수 있지만 UIProgressView는 IntrinsicContentSize로 크기를 알 수 없어서 에러가 ..
[iOS] - ContentSize(셀 전체) 만큼 커지는 UITableView/UICollectionView
ContentSize(셀 전체) 만큼 커지는 UITableView/UICollectionView UIButton, UILabel 처럼 contentSize만큼 intrinsicContentSize가 커지도록 적용한 커스텀 테이블뷰/ 컬렉션뷰 입니다. 리스트 전체를 한 번에 보여줘야하는 컴포넌트를 만들 때 유용하게 사용할 수 있습니다. 물론 이렇게 사용하면 재사용 하는 부분이 없기 때문에 UIStackView만을 이용해서 만들 수 있지만 변경된 새로운 값을 보여줘야 할 때 StackView는 변경점을 찾아 수정하고 전체를 업데이트 해줘야 하지만 TableView/StackView는 변경된 값을 바인딩만 시켜주면 끝이라 더 쉽고 효율적입니다, open class IntrinsicContentHeightTab..