본문 바로가기

반응형

전체 글

(62)
swift) 페이스북 로그인 앱 추적 투명성이 필요한 이유 Facebook 로그인을 구현하면서 이유없이 막힌 부분이 있었다. 토큰은 발급해주지만 이것이 실제 유효하지 않은 토큰으로 보내는 것이었다. 원인을 파악하고자 Facebook 공식문서를 찾아봤다.  iOS 14.5부터 ATT라는 것이 생겼고 iOS 14.5 이후부터는 ATT라는 것이 필요하다는 것을 알게되었다.  App Tracking Transparency(ATT)란?ATT는 iOS 14.5 이상에서 사용자의 개인 정보를 보호하기 위해 도입된 기능으로, 앱이 사용자의 데이터를 추적하려면 반드시 사용자의 명시적인 동의를 받아야 하는 시스템을 말한다.  이에 따라 14.5 이후에는 광고 식별자 사용, 사용자 데이터를 수집 및 공유하는 경우 반드시 ATT 권한을 요청해야 한다는 것을 알게 되었다. 당시에 관련..
UIKit) 최상단을 계속 유지하는 토스트 메세지 만들기 기존에 토스트 메세지를 만들고자 했을 때 다음과 방법을 사용했었다.guard let window = UIApplication.shared.windows.first(where: { $0.isKeyWindow }) else { return }먼저 사용하는 윈도우 중 key 윈도우를 찾는다.그리고 해당 윈도우에 최상위 뷰를 찾아서 그곳에 토스트 메세지를 사용했을 것이다. 이렇게 토스트 메세지를 만들면 문제가 발생한다.먼저 토스트 메세지를 띄우는 순간에는 UIWindow 내에서는 최상위이겠지만 FullScreenConver를 띄우는 순간최상위 뷰는 토스트 메세지가 아닌 FullScreenConver로 띄운 뷰가 되어버리는 것이다.  때문에 다음과 같이 토스트 메세지가 사라졌다.  문제 해결guard let wi..
swift) 빌더 패턴 알아보기 빌더 패턴이란?복잡한 객체의 생성을 단계적으로 처리할 수 있도록 도와주는 디자인 패턴생성자에서 모든 매개변수를 한 번에 받는 방식과 달리 빌더 패턴은 체이닝 방식을 활용하여 객체를 점직적으로 구성할 수 있다. 특징객체 생성을 단계적으로 수행 가능 (체이닝을 지원)때문에 읽기 쉬운 코드 구조를 만들 수 있음빌드 패턴을 사용하지 않는 경우struct UserProfile { let name: String let age: Int let email: String? let phoneNumber: String? init(name: String, age: Int, email: String? = nil, phoneNumber: String? = nil) { self.nam..
SwiftUI) 하위 뷰의 크기 추적(Preference) 문제 상황특정 뷰에 대한 크기를 파악해야 하는데 특정 뷰가 서버 값을 통해서 중간에 크기가 달라지는 경우가 발생하였다.기존에 onAppear로 해당 뷰의 크기를 알아내고자 했을 때, 값을 한 번 알아낼 수는 있지만 그 후 서버에서 받은 값으로 뷰가 채워지고 크기가 달라지는 것까지 파악하지 못하는 문제가 있었다. 하위 뷰에서 상위 뷰로 값을 전달하는 것에 대한 문제를 찾아보던 중 Preference라는 프로토콜을 알게 되었다.  Preference란?하위 뷰에서 컨테이너(부모 뷰)로 설정 값을 전달하기 위해 사용되는 API Collection이다. 하지만 여러 하위뷰에서 하나의 컨테이너로 값을 보낸다면 충돌이 있을 수 있기 때문에 이를 어떻게 합칠지 정의를 내려야 한다."a single container ..
SwiftUI View 성능 향상을 위한 종속성 최소화하기 올해 WWDC23에 나온 영상을 보고 SwiftUI의 종속성, 그리고 퍼포먼스에 대해 고민을 하기 시작했다. SwiftUI는 구현이 UIKit보다 간편하게 구현할 수 있다는 장점이 있다. 하지만 그간 View의 성능이 향상되는 것에 대한 고민은 해보지 못했던 것 같다. 어떻게 성능향상을 이뤄낼 수 있을까? SwiftUI View는 기본적으로 데이터가 변화하면 화면을 다시 그리는 작업을 수행한다. 때문에 개발자는 어떤 데이터가 바뀐 뷰만 업데이트하고 싶을지 몰라도 데이터와 연결(종속 관계에 있는)된 다른 뷰가 업데이트 될 수 있다. 이러면 성능의 저하를 불러 일으킬 수 있다. 따라서 업데이트 횟수를 줄이는 것을 항상 염두해 두어야 한다. 여기서 업데이트 횟수를 줄이기 위해서 소개할 방법은 2가지이다. 첫 ..
클린 아키텍처(CleanArchitecture) 의존성 역전(DIP)에 대해 요즘 클린아키텍쳐 공부에 대한 필요를 느껴 객체지향, 클린아키텍쳐에 대해 공부를 이어나가고 있다. 오늘은 클린 아키텍쳐 전부에 대해서 설명하기보단 Domain Layer 부분 중 Repository Interface(protocol)을 중점적으로 다룰 예정이다. 그래도 기본적인 공부와 함께..! 그럼 클린 아키텍처를 공부하기 전에 아키텍쳐란 무엇일까? 아키텍쳐는 "구성과 동작원리, 구성 요소 간의 관계 및 시스템 외부 환경과의 관계를 설명하는 설계도"라고 할 수 있다. 그렇다면 아키텍처에 대해서 사람들은 왜 이렇게 중요하다고 할까? "클린 아키텍처"라는 책에서는 "기능"과 "아키텍쳐"에 두 가지에 대해서 도입부에 이야기를 한다. 지금까지의 나의 개발과정을 되돌아본다면 나는 "기능"에 초점을 맞췄다. '이..
[SPM 디자인시스템] 로컬 환경에서 테스트 해보기 최근 "스파클"이라는 프로젝트를 하면서 SPM을 활용해서 폰트, 색상, 디자인 시스템을 모듈화시키는 작업을 했다. 사실 SPM을 사용했지만 그냥 프로젝트 내에서 진행했을 때보다 장점이 있나? 라고 했을 때 명확한 답을 내리지 못했다. 만약 현재의 디자인 시스템을 가지고 관리자 앱? 이라든지 다른 프로젝트를 진행한다고 했을 때 바로 패키지를 추가하면 되니까 장점이 있을지도?? 아무튼 우리가 하나의 프로젝트와 하나의 패키지 매니저, 즉 두 개의 파일을 만들어서 작업을 했는데 우리의 워크 플로우는 다음과 같았다. (SPM으로 디자인 시스템을 만들고 수정사항이 발생했을 때) 디자인시스템에서 수정할 것이 생기면 패키지 매니저에서 대놓고 바꿀 수 없었다! 왜냐면 연결되어 있는 프로젝트가 있어야 잘 수정이 되어있는지..
[RealmSwift Test] "오운완" Mock을 활용한 Realm 테스트 요즘 테스트 공부를 한창 하고 있다. realm를 테스트할 때 실제 realm객체에 접근하고자 하면 테스트 간 일관성이 유지되지 않는다고 한다. (음..실제로 가짜 객체를 두지 않고 테스트 코드를 돌려봤을 때 RealmStudio에는 사실 반영이 되지 않았다. 그치만 또 이미 있는 데이터라고 나타나서 테스트도 되지 않았다.. 영향을 주는 것 같기도 주지 않는 것 같기도..더 알아볼 필요가 있을 것 같다.) 그래서 테스트용 가짜 객체를 만드는데 이것을 "Mock"이라고 한다. 실제 서비스에는 ProductionRealm, 테스트에는 MockRealm 이렇게 구분했다. 우선 프로토콜을 사용해서 RealmProvider(어떤 Realm을 제공해줄지) protocol RealmProviderProtocol { ..

반응형