일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- JS
- 노드JS
- 웹크롤링
- 교환학생토플
- Python3
- IOS프로그래밍
- 카카오톡채팅봇
- 인프런파이썬강의
- SwiftUI
- 토플
- swift
- nodeJS
- 인프런
- 인프런오리지널
- rxswift
- uikit
- 인프런파이썬
- 프로그래머스
- 자바스크립트
- 파이썬중급강의
- 스위프트
- IOS
- 우리를위한프로그래밍
- 인프런강의
- 토플공부수기
- 파이썬중급
- 유학토플
- 리프2기
- 파이썬
- 파이썬웹크롤링
- Today
- Total
목록전체 글 (137)
먹고 기도하고 코딩하라
결론부터 얘기하면 있다. ReactorKit의 Reactor 파일을 살펴보면 extension에서 disposeBag을 찾을 수 있다. extension Reactor { fileprivate var disposeBag: DisposeBag { return MapTables.disposeBag.value(forKey: self, default: DisposeBag()) } } 하지만 fileprivate 레벨로 선언된 변수이기 때문에 커스텀해서 만드는 Reactor 내에서 직접 접근할 수는 없다. disposeBag의 존재 의의가 궁금해진다. 기원을 찾아 올라가기 위해 MapTables.disposeBag으로 이동한다. MapTables는 enum 타입이고, disposeBag 변수가 포함되어 있다. p..
한 줄 요약 iOS 17 이상에서 UIGraphicsBeginImageContext()를 시도할 때, 이미지 사이즈가 (0, 0)인 경우 강제종료될 수 있으므로 UIGraphicsImageRenderer를 쓰는 것이 권장된다. 메이저 앱 배포 후 갑자기 ImageContext 관련해서 크래시리틱스에 이슈가 많이 나왔다. **NSInternalInconsistencyException - UIGraphicsBeginImageContext() failed to allocate CGBitampContext: size={0, 0}, scale=1.000000, bitmapInfo=. Use UIGraphicsImageRenderer to avoid this assert.** 이런 에러 메시지가 포함되어 있었는데,..
작년 11월 초부터 면접을 보러 다닌 것 같다. 서류를 넣기 시작한 건 10월 말쯤부터였다. 원래 취업을 더 미루려고 생각했는데, 작년 10월 중순쯤 모 기업의 공채에 지원하려고 서류를 공들여 썼던 게 발단이 됐다. 그런데 서류를 다 쓰고 보니 여기만 넣기 아까워서 다른 데도 넣어보자.. 했던 게 날 1달만에 회사원의 길로 인도했다. 첫 회사 입사 지금 회사를 선택한 이유는 여러 가지지만, 가장 큰 이유는 라이브 서비스를 운영 중이고 실제 고객들이 10만 명 단위로 존재한다는 점이었다. 당시 면접을 봤던 보스가 면접 보실 때 지원자인 나를 정말 성의껏 대해주셨다는 점도 한몫했다. 보스의 인품이 저렇다면 조직 분위기도 괜찮겠다는 생각이 들었고, 회사 규모도 나쁘지 않아서 재직 중에 회사가 갑자기 문을 닫는..
우리 회사 앱은 iOS 12까지 지원하고 있는데, 얼마 전에 12.5 유저가 앱을 켜자마자 바로 강제종료된다는 CS가 들어왔다. 센트리에도, 크래시리틱스에도 에러가 잡히지 않아서 이상하게 생각하고 있었다. 정상적으로 사용했다고 보고된 마지막 사용 로그를 살펴보는데 앱 버전이 달랐다. 그렇다면 업데이트된 버전 사이에서 뭔가 달라졌을 텐데 하는 생각이 들어 iOS 12 테스트 폰을 빌려 빌드를 해봤다. 과연 앱이 실행하자마자 바로 강종됐다. 콜스택에 뭐가 쌓인 것도 아니고, AppDelegate의 가장 첫 메소드에 찍은 브레이크포인트도 안 타고 그냥 강제종료. Thread 1: EXC_BAD_ACCESS 와 나에겐 별 도움이 되지 않는 주소값을 함께 제공하는 차가운 메시지와 함께… 지푸라기라도 잡는 마음에 ..
iOS 17에서 기존과 같이 위젯을 만들었을 때, 크게 2가지 문제점이 있다. 위젯 위아래의 마진으로 레이아웃 깨짐 디버그 모드에서 설치 안됨 1. 위젯 위아래의 마진으로 레이아웃 깨짐 대응을 하지 않은 경우, iOS 17에서의 위젯은 위아래로 마진이 생긴다. 그래서 기존에 설정해둔 레이아웃이 깨지게 된다. 다행히 iOS 17 이상에서 이 마진을 무시할 수 있다. Widget의 body, WidgetConfiguration에서 다음과 같이 .contentMarginDisabled()를 적용해주면 마진을 무시하게 된다. var body: some WidgetConfiguration { let configuration = StaticConfiguration(kind: kind, provider: Provid..
올해 9월에 Xcode 15가 정식으로 배포되면서 집에서도 회사에서도 Xcode 버전을 올렸다. 메이저 업데이트를 한 뒤 마이너 업데이트를 앞두고 이슈를 처리하던 중.. 마스터 브랜치를 풀받았는데, 빌드는 성공하지만 Unable to Install 하면서 기기에 앱이 설치되지 않았다. 에러 메시지는 다음과 같았다. the bundle info.plist does not contain a cfbundleversion key or its value is not a string. 버전이 없다니? Info.plist와 프로젝트 Identity 탭을 확인해봤지만 프로젝트 버전은 멀쩡했고 마케팅 버전까지도 잘 살아 있었다. 클린 빌드도 해보고 맥도 재시동해봤지만 문제는 여전했다. 마스터 브랜치에 뭔가 있었던 건 아..
큰 업데이트 전에는 사내 배포 및 외부 고객센터에 앱 배포가 필요한 경우가 있다. iOS의 경우, 앱스토어에 등록되지 않은 개발용 앱인 경우 프로파일에 등록된 기기들만 앱을 설치할 수 있다. 사무실 상근 임직원분들 외에도 직접 만날 수 없는 고객센터 근무자 분들의 폰을 등록해야 하는 경우가 발생한다. 또한 폰을 등록한 후에도 프로비저닝 업데이트 후 사내 배포를 위해 따로 빌드가 필요하다. 이번 주는 사내 배포용 앱을 빌드하고, 외부 고객센터 기기 등록하는 작업을 하다가 난항을 겪었다. 사내 컨플에 공유한 문서인데 좀 더 일반적으로 수정해서 블로그에도 올린다. 오라.. 달콤한 프로비저닝 업데이트여.. 🤯 사무실 외부의 기기 등록 프로파일에 등록되지 않은 iOS 기기들을 등록하는 일은 내가 도맡아 했는데, ..
Observable 구독하는 클로저에서 이벤트가 발생하면 UI를 업데이트해주는 코드가 있었다. 그런데 observe를 메인 스레드가 아니라 다른 스레드에서 하고 있어서 이벤트를 받아 onNext 하면 메인 스레드가 아닌 데서 UI 조작한다고 앱이 강제종료되는 이슈가 생겼다. .observe(on: MainScheduler.Instance)를 체이닝에 추가해서 메인 스레드에서 관찰하도록 변경해줌으로써 이슈는 해결했다. 그런데 문득 궁금해졌다. 그러니까, onNext에서 할 행동을 DispatchQueue.main.async { } 블록으로 감싸줘도 되는 게 아닌가? 이 둘은 퍼포먼스상으로 유의미한 차이가 있을까? 먼저 .observe(on: MainScheduler.Instance) 메소드부터 살펴보자. ..