Open API Generator 를 초기 세팅 이후 사용하면서 점차 적응해보고 있다. Open API Generator 에 미들웨어를 적용해 네트워크 레이어에 필요한 여러 기능을 사용했다.우선, 내가 필요했던 기능은 다음과 같다. - 로깅 - 엑세스 토큰 주입 - 401 에러 캐치, 리프레시 토큰 갱신 후 재시도 (retry) 주로 사용했던 Alamofire 에서는 Interceptor 와 Event Monitor 로 사용했던 기능들인데,다행스럽게도 미들웨어의 example 이 잘 되어 있고, Swift Concurrency 를 활용해 간결하게 되어 있어어렵지 않게 적용할 수 있었다. 우선 미들웨어는 결국 인터셉터다. 프로토콜로 되어있는데, public protocol ClientMiddlewar..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/DwuaR/btsIUUi6uQ3/BVTE73WPKyKdS7kEwsvOGk/img.png)
사건의 발단회사 프로젝트에 date를 비교하여 유효한지 체크하는 로직이 있었다.간단한 로직이고 대부분 유저들에게 잘 작동했는데, 어느 한 유저만 작동하지 않는다고 문의가 들어왔다.로그를 살펴보니, 당연히 되어야 하는 date 비교 후 결과를 리턴하는 함수에서 false 를 리턴하는 것이였다. 본래 로직은 서버에서는 "yyyyMMddHHmmss" 형식으로 시작일과 종료일을 date를 내려주고 있었고,date 객체로 변환하여 현재 시점이 validate 한지 체크했었다. 모든게 정상이였다. 대부분 유저들도 잘 사용했고 내 시뮬레이터와 실기기, 테스트코드 환경에서도 잘 작동해서 실마리를 찾는게 어려웠다. 그런데 google 에 'swift dateForamtter issue' 를 검색하니 dateFormatt..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/ncoKF/btsCUyMiy5X/yLayNbfKKF9OPOMltWHbC0/img.png)
연말에 전혀 예상하지 못한 오류가 보고되었다. 유저는 분명 2023년 12월 31일을 선택했는데, 2024년 12월 31일 로 나오는 이슈가 있었다. 시간이 바뀌거나 하루 단위면 UTC 관련 이겠구나 싶었는데, 다른 날짜들은 모두 정상이였고, 연도가 바뀌는 현상은? 아무런 생각도 들지 않고 감도 못잡았다. 결론부터 말하자면, 간단한 오타에 의한 이슈였다. DateFormatter DateFormatter는 서비스 영역에서 너무나 자주 만나게되는 고마운 녀석이다. "yyyyMMddHHmmss" 형식을 관례적으로 늘 자주 사용하다보니 dateFormat 이 문제일줄은 몰랐다. 눈을 씻고 기존에 (누군가) 작성해둔 코드를 찾아보니 yyyy가 소문자가 아닌 대문자 YYYY 로 되어 있었고, 여기서, yyyy 와..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bQmC1Z/btsz91iTzaY/lF31UFM7FG9NUMQT9h21Jk/img.png)
최근 회사에서 Watch App을 만들게 되어 열심히 만들고 있다. Watch App을 간단히 살펴 보자면 - 이전에는 UIKit으로도 만들 수 있었는데, 이제는 SwiftUI로 안만들 이유가 없을 듯 하고, - 폰에서 데이터 전송이 대부분 필요할텐데, shared UserDefaults 가 아닌 Watch Connectivity를 통한 전달이 필요하다. UIKit만 바라보던 나는 미뤄두던 SwiftUI를 이참에 공부를 했고 (이건 신세계..) Watch Connectivity에 대해 공부를 했었다. 본 포스트에서는 개념보다는 WatchApp을 만들어 가면서 만났던 이슈에 대해 정리를 해보려고 한다. 1. Watch OS 버전 개발을 위해 회사에서 지급받은 워치5는 무려 9.6.3 버전이다. (23년 9..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/OejEP/btsyTrX90K7/94CRBaKKatqpKtI521ikY1/img.png)
내가 구현하는 FLO 앱의 두가지 뷰에는 모두 가사가 들어있으며, 시간에 맞춰 자동으로 스크롤된다. Player 뷰 에서는 두줄을 보여주며 스크롤 되며, 가사 영역을 터치할 경우 가사가 크게 나온다. 1. 기능 분석 플레이어 뷰(좌측) - 오토 스크롤 - 하이라이팅(흰 글씨) - 가운데 정렬 - 유저 터치시 가사뷰로 이동 가사 뷰(우측) - 오토 스크롤 - 하이라이팅(흰 글씨) - 좌측 정렬 - 유저 터치시 해당 영역으로 플레이어 이동 - 유저의 스크롤도 가능 - 가사 컨트롤 버튼 존재 플레이어 뷰의 기능에서 더 확장된 것이 가사 뷰 라고 할 수 있겠다. 동일한 클래스를 사용할 수 있도록 LyricTableView를 만들고, 각 뷰별로 해당하는 옵션을 넣어주도록 하자. 2. 모델 만들기 먼저 테이블 뷰에..
FLO MusicPlayer 앱에서 사용하는 AVPlayer는 음악을 재생시키고, 컨트롤를 하는 핵심 요소로 사용된다. AVPlayer를 어떻게 사용했는지 알아보자 먼저, iOS의 프레임워크들에서 자주 사용했던 자연스럽게 delegate를 채택하려고 했지만, delegate가 AVPlayer에는 없다. 대신, KVO(Key-Value-Observing) 방식으로 AVPlayer의 상태값을 받아올 수 있다. KVO는 존재만 알고 있었던지라, 이번 기회에 공부를 해보았다. KVO 짧은 정리 KVO는 NSObject의 기능으로 willSet, didSet 과 유사하다고 볼 수 있음 프로퍼티의 상태 변화에 대해 '외부' 에서 옵저버를 추가할 수 있음 (willSet, didSet은 내부에서 추가 필요) 외부에서..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bQg5NI/btsyqvfWb92/nGJ2EUrFkOmglhIYK7Kak0/img.png)
그동안 궁금했었던 부분들에 대해 공부하는 시간을 가져보던 중 평소 관심있었던 부분인 뮤직 플레이어를 만들어 보고 싶었다. FLO의 플레이어 뷰를 보면 기능 요구사항은 다음과 같다. - 플레이어 컨트롤 버튼 - 시간에 따른 가사 자동 스크롤 - 가사를 탭 했을 때 해당 부분으로 이동 - 음악 정보(이미지, 곡 정보 등) 사용한 프레임워크와 앱의 구조를 살펴보자 1. AVFoundation AVFoundation은 [ CoreAudio / CoreVideo / CoreMedia / CoreAnimation ] 위에 있는 프레임워크다. Core 패밀리들은 iOS 혹은 MacOS 등에서 하드웨어와 함께 Low-Level 로 동작하는 프레임워크들이고(C 기반), AVFoundation은 Core 패밀리 위에서 멀..
- Total
- Today
- Yesterday
- watch connectivity
- 2024년
- Xcode
- open-api-generator
- retry
- OAS
- locale
- KVO
- musicplayer
- openapi-generator
- 토큰
- IOS
- flo
- Xcode15
- TextField
- 애플워치 데이터 전송
- AVFoundation
- watchOS
- 회고
- swift날짜
- DateFormatter
- SwiftUI
- auth
- 소수점
- 애플워치
- demical
- keyboardtype
- easy cue
- Swift
- avplayer
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |