일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- SwiftUI
- url 관찰
- transformation.map
- ViewBuilder
- UIViewControllerTransitioningDelegate
- swift
- GeometryReader
- List
- Android
- scrolling tab
- detect url
- swift #swift keychain #keychain 사용법
- Swift Package Manager
- notifychanged
- Tuist
- 개발자 면접
- ios
- 스크롤 탭
- DataBinding
- Side Menu
- convert base64
- 기존 앱
- url 추적
- base64 변환
- UIPresentationController
- 상단 탭바
- oberve url
- pod install
- DevelopmentRegion
- development language
- Today
- Total
목록IOS (30)
버그 잡이
Static Library에 대한 통념 Static Library는 Dynamic Library보다 앱 용량을 많이 차지한다는 것이 일반적인 생각입니다. 왜냐하면 iOS기준 Static Library는 Library 파일을 복사해서 앱 excutable 파일에 포함시키기고 반면 Dynamic Library는 라이브러리에 대한 참조만 앱의 excutable 파일에 포함시키기 때문입니다. Dynamic -> Static으로 바꾼 결과 = Launch time 개선, App Size 감소(?) 개발중인 iOS 앱의 서드파티 라이브러리 포함 방식을 바꿀 기회가 생겼습니다. 기존은 Cocoapods을 사용중이고 Dynamic 방식이었습니다. 그런데 앱 런치 타임이 느려진 이슈가 있어서 이를 해결하는 과정에서 Dy..
문제 상황 WKWebview의 userContentController에 .add()를 통해서 웹페이지와의 인터페이스를 연결하는데 이때 들어가는 self로 인해 순환참조가 발생한다. webView.configuration.userContentController.add(self, name: "something") 해결 방법 self를 직접 넣는 것이 문제이니, self를 약하게 가지고 있는 객체를 만들어서 대신 넣어준다. (그 결과 순환 참조가 일어나지 않는다) webView.configuration.userContentController.add(WKWebViewLeakAvoider(delegate: self), name: interface.rawValue) class WKWebViewLeakAvoider ..
문제 상황 웹뷰에서 아래와 같은 크래시가 발생하였습니다. KVO_IS_RETAINING_ALL_OBSERVERS_OF_THIS_OBJECT_IF_IT_CRASHES_AN_OBSERVER_WAS_OVERRELEASED_OR_SMASHED 옵저버가 overreleased 되거나 smashed 되어서 생긴 이슈라고 합니다. 발생 환경 1) 웹뷰는 아래 옵저버를 가지고 있다. webview.addObserver(self, forKeyPath: "estimatedProgress", option: .new, context: nil) 2) 위 웹뷰가 2개 이상 겹쳐서 띄워져 있다. 3) 웹뷰들을 한번에 dismiss 한다. 원인 분석 (뇌피셜) 같은 이름의 옵저버가 2개 이상 있고, 이를 해제하려고 할때 참조가 꼬여..
먼저 Static Library와 Dynamic Library의 개념과 장단점에 대해서 간단하게 알아보고 넘어가겠습니다. Dynamic vs Library 비교 Static Library Excutable 파일에 라이브러리 파일이 포함됨 Dynamic Library 런타임 중에 필요시 해당 라이브러리 코드를 찾아서 연결 (Excutable 파일안에 코드가 있는 것이 아니라 프로그램 안에서 Framework로 따로 관리되는 개념) # 장단점 Static Library 장점: 런타임에 해당 라이브러리 파일을 찾을 필요가 없기 때문에 앱 런치 타임 속도를 줄일 수 있음 단점: 앱 사이즈가 커짐 Dynamic Library 장점: 앱 사이즈가 작음 단점: 앱 런치 타임 속도를 느리게 할 수 있음 Launch T..
SplitViewcontroller 구조의 아이패드 앱은 멀티태스크 동작으로 화면 사이즈가 줄어들면 기존에 나눠졌던 화면 중 하나가 사라지게 됩니다. 두 개로 나뉘어진 구조를 기준으로 * 왼쪽: Master * 오른쪽: Detail 이라고 칭하는데, 보통 Master가 남고 Detail이 사라집니다. 그런데 갑자기 이런 요구사항이 들어옵니다. "SplitViewController가 collap 될때 detail 화면이 남고 master 화면이 사라지게 해주세요." 위 그림처럼 되는 구조인데 어디 한번 방법을 찾아봅시다. 1. UISplitViewControllerDelegate 함수 찾아보기 UISplitViewControllerDelegate에서 관련된 기능을 제공하는 함수가 없는지 찾아봤습니다. 그 ..
Viper나 RIBS 같은 패턴은 화면 전환 로직을 담당하는 라우터를 모듈화 해서 관리하는 것으로 알고 있는데, ReactorKit은 화면 전환 로직을 어떻게 관리하는지에 대한 궁금증이 생겼습니다. 공식 문서와 샘플 예제를 찾아보니, 라우터를 관리하는 정형화된 방식은 없는 것 같고. 라우터를 모듈화하고 싶으면 ReactorKit에 추가적인 플로우 관련 패턴을 더하는 식으로 진행되는 것 같았습니다. ReactorKit + RxFlow ReactorKit + Coordinator 패턴 위와 같이 사용되는 것을 볼 수 있었습니다. 이번 글에서는 ReactorKit + Coordinator 패턴에 대해서 알아보고자 합니다. RxFlow는 잠깐 보니 러닝커브도 좀 있고, Coordinator 패턴을 먼저 이해하고..
ReactorKit을 공부하면서 trasform()이라는 함수를 접하게 되었습니다. "Action으로 Mutation(mutate() -> reduce()) 되어 State가 바뀐다." 이게 제가 이해한 ReactorKit의 기본 동작입니다. transform() 낄 자리가 없어보이는데 도대체 어떤 역할을 하는 함수일까요? Transform() transform()을 이해하기에 없어서 ReactorKit의 전역 변수에 대해서 알아볼 필요가 있습니다. 공식 문서를 보면 ReactorKit은 전역 변수를 정의 하지 않는다고 합니다. Action -> Mutation -> State 플로우에서 전역변수가 낄 자리가 없는거죠. 그런데 Action이 아닌 전역변수의 변화로 인한 Mutation은 어떻게 처리해야할..
기조 상용중인 앱에 아이패드 모드를 지원하게 되었습니다. 관련 작업을 하면서 새롭게 배운점과 느낀점들을 정리해보겠습니다. 1. frame 보다는 Auto-layout을 사용하자. 앱을 보면 팝업, 커스텀 키패드 등이 frame으로 layout이 잡혀 있었습니다. 이는 가로/세로 디바이스 회전시 레이아웃을 깨지게 만듭니다. 간단하게 오토레이아웃으로 변경할 수 있는 View는 오토레이아웃으로 레이아웃을 설정하도록 변경해주고, 변경이 다소 무리인 경우에는 "viewWillTransition()" 이라는 viewController의 override 메서드를 활용하여 문제를 대응할 수 있습니다. 디바이스의 회전을 감지하고 디바이스 스크린 Size를 받을 수 있는 메서드이다. size 값을 활용하면 회전시 화면 대..