일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- JS
- 토플공부수기
- 인프런파이썬강의
- SwiftUI
- 리프2기
- swift
- 교환학생토플
- 토플
- 파이썬
- 유학토플
- 파이썬중급강의
- 자바스크립트
- IOS
- 노드JS
- nodeJS
- rxswift
- 웹크롤링
- 카카오톡채팅봇
- uikit
- 우리를위한프로그래밍
- 스위프트
- 인프런
- 프로그래머스
- 인프런파이썬
- IOS프로그래밍
- 파이썬중급
- 인프런강의
- 인프런오리지널
- Python3
- 파이썬웹크롤링
- Today
- Total
목록전체 글 (130)
먹고 기도하고 코딩하라
회사에서 3번째로 맡은 프로젝트는 구글 로그인 지원이다. 웹, 안드로이드에서는 구글 로그인이 지원되는데 iOS에는 해당 기능이 없어 이번에 추가하게 됐다. 예전에 해본 적은 있었는데, 다시 하려니 뭔가 헷갈려서 정리한다. 글을 수정하는 2023년 4월 기준 구글 로그인 최신 버전은 7.0.0이다. 5 버전과 좀 달라졌다 하는 건 GIDSignIn.sharedInstance를 어떻게 쓰느냐 여부와 SignIn을 delegate 방식으로 하느냐 바로 클래스 메소드를 사용하느냐 하는 약간의 차이만 있다. 순서 (1) Podfile 혹은 SPM으로 GoogleSignIn 패키지를 추가한다. (2) 파이어베이스 콘솔 들어가면 OAuth 2.0 클라이언트 ID를 확인할 수 있다. com.googleuserconte..
2월 한 달동안 회사에서 데이터를 기기에 저장하는 작업을 진행했다. M 대리님이 하던 작업인데, 중간에 어떤 문제 때문에 꼬여서 중단됐던 걸 내가 맡아서 에러 고치고 기능 마저 구현하고 QA 티켓 처리하면서 마무리짓게 됐다. (곧 배포 예정! 예이~) QA에서 나온 이슈 중에 하나가 클립을 다 재생하면 앱이 강제종료된다는 거였는데, 로그를 찾아보니 RLMException 때문에 죽고 있었다. 클립을 다 재생하면 위젯 데이터를 업데이트하는 함수를 호출하게 되어 있는데, 오프라인 모드일 때는 Realm에서 값을 읽어오는 작업을 한다. 여기서 exception이 일어났다. 원인 이 에러는 보통 Realm 객체를 생성한 스레드와 Realm에 접근하는 스레드가 다르기 때문에 발생한다. Realm은 thread-c..
요즘 회사에서 다운로드 작업을 하고 있다. 까다로운데, 또 까다로운만큼 해결할 때의 쾌감이 장난 아닌 작업이다. 정처기 공부할 때 DRM 봤을 때는 이게 나랑 연관 있는 얘기 될 줄 몰랐지.. 팔자에도 없는 줄 알았더니 -_- 아무튼 이 태스크 때문에 이슈가 조금 있어서, 왜 iOS 버전에 따라 태스크를 달리 써야 하는지, 또 이 태스크가 근본적으로 무슨 차이가 있는지 좀 알아봤다. 사실 AVAssetDownloadTask는 iOS 9+, AVAggregateAssetDownloadTask는 iOS 11+ 이상을 지원해서 11 이상을 지원하는 우리 앱에서는 사실 일괄적으로 Aggregate 써도 상관없긴 한데, 또 이게 으른의 사정과 내부적인 이슈가 있어서 버전별로 태스크를 나눠 쓰고 있다. Swift로..
파이썬으로 문제를 풀다가 최근에는 스위프트로 문제를 푸는 연습을 했다. 제일 난감했던 것 중 하나는 스위프트 String은 인덱스를 지정할 때 그냥 Int형 숫자를 쓸 수 없고 String.index 타입을 써야 한다는 거다. String에 extension으로 커스텀 코드 추가하면 배열 접근하듯이 쓸 수 있게 만들 수 있는데, 문제 한 개 풀 때마다 귀찮아서 그 짓 어떻게 하나 싶기도 하다. 어차피 문자열 안 다룰 수는 없으니까 그냥 겸사겸사 index를 같이 본다. 문자열 인덱싱 var lyrics = "Thunder only happens when it's raining" print(lyrics[lyrics.startIndex])// T print(lyrics[lyrics.index(before: ..
iOS 개발자라면 iOS 13과 함께 등장한 sceneDelegate를 모를 수가 없을 텐데, 우리 앱은 최소 지원 버전이 iOS 11이다. 지금까지는 sceneDelegate를 도입하지 않고 AppDelegate만 관리했다. 어쨌든 Info에 scene manifest 설정을 안 하고 sceneDelegate 도입을 안 하면 13 이상 버전도 appDelegate를 타긴 타니까. 이번에 카플레이를 지원하게 되면서 sceneDelgate를 도입하게 됐다. 카플레이 스크린을 띄우려면 CPTemplateApplicationSceneDelegate라고 카플레이 씬에 대한 delegate가 필요한데, UISceneDelegate가 없이 단독으로 카플레이 씬만 띄우고 delegate 만드는 게 불가능했기 때문이다..
회사 들어와서 작은 업무 하나 맡고 운영 이슈 처리하다가 카플레이를 첫 프로젝트로 받았다. 애플 카플레이는 폰과 차를 연동해서 차에서 폰을 쉽게 사용하기 위해 만들어졌다. (운전 중 폰하면 위험하니까) 카플레이라서 음악 앱만 될 것 같지만 꼭 그렇지만도 않다. 우리 회사 앱 주력 서비스가 플레이어다 보니까, 카플레이를 지원해달라는 요구가 몇 년 전부터 있긴 했나보다. 오랜 숙원사업처럼 남아 있었는데 인력이 모자라서 진행하질 못하다가 이번에 내가 들어와서 맡게 됐다. 카플레이는 해본 적이 없지만... 뭐 일이라는 게 항상 해본 것만 할 수는 없는 거니까. 그나마 J님과 M 대리님이 미리 위키에 써두신 게 있어서 그걸 참고하면서 뚝딱뚝딱 만들었고 이제 QA를 목전에 두고 있다. 카플레이를 개발하면서 웃겼던(..
또 1년이 지났다. 작년 이맘때쯤에는 혼자만의 시간을 좀 보냈다. 나홀로 피정 느낌이랄까... 그 때 한 해를 정리하면서 나를 깨끗이 비웠던 경험이 좋았는데 올해는 그럴 기회가 없어서 좀 아쉽긴 하다. 이번 달은 유독 정신없는 달이었다. 회사에 들어가서 여러 가지 일들을 겪었고, 주말마다 약속이 있어서 하루도 집에 있어본 날이 없다. 크리스마스인 오늘은 약속을 잡지 않고, 집에서 연말을 정리하고 나를 돌아보기로 했다. 올해는 일기장 없이 한 해를 보냈다. 후회한다. 달력으로 일정 관리하는 것만으로는 하루하루를 붙잡기가 너무 어렵다. 내년부턴 선물로 받은 다이어리를 쓸 예정이다. 기억나는 것만 갈무리해본다. 올해 한 일 1. 수발들기 (...) 2. 중급 알고리즘 스터디 3. CS 스터디 4. 블로그 + ..
회사 와서 딥링크가 뭔지 첨 알았다. 모르는 게 많고 내가 업무를 통해 배워갈 게 많다는 게 좋긴 한데 잘 이해 못해서 버벅일까봐 그게 좀 걱정.. 아무튼, 코드 분석하면서 deeplink 어쩌구 되어 있는 건 보긴 봤는데 정확히 뭔지는 모르겠지만 당장의 분석에 크게 필요하지 않은 거라서 넘겼는데 공부하면 좋을 것 같다고 하셔서 주말 걸쳐서 공부했다. 우선 딥링크는 하이퍼 링크의 모바일판과도 같다. 특정 주소나 값을 입력하면 앱이 실행되거나, 앱의 특정 화면으로 이동한다. 음.. 예를 들면, 핸드폰하다가 쿠팡 물건 광고가 뜨는 경우를 생각해볼 수 있겠다. 쿠팡 앱이 설치되어 있을 때 광고를 누르면, 바로 쿠팡 앱이 켜지면서 그 상품으로 넘어가는 이런 게 딥링크의 일종이라고 할 수 있을 것 같다. 서버에서..