
사건의 발단회사 프로젝트에 date를 비교하여 유효한지 체크하는 로직이 있었다.간단한 로직이고 대부분 유저들에게 잘 작동했는데, 어느 한 유저만 작동하지 않는다고 문의가 들어왔다.로그를 살펴보니, 당연히 되어야 하는 date 비교 후 결과를 리턴하는 함수에서 false 를 리턴하는 것이였다. 본래 로직은 서버에서는 "yyyyMMddHHmmss" 형식으로 시작일과 종료일을 date를 내려주고 있었고,date 객체로 변환하여 현재 시점이 validate 한지 체크했었다. 모든게 정상이였다. 대부분 유저들도 잘 사용했고 내 시뮬레이터와 실기기, 테스트코드 환경에서도 잘 작동해서 실마리를 찾는게 어려웠다. 그런데 google 에 'swift dateForamtter issue' 를 검색하니 dateFormatt..

올해 초 회사 프로젝트에 큰 변화가 있었다. 단일타겟이였던 앱 프로젝트를 멀티모듈로 전환했다.신규 기능 개발 + 유지보수 와 함께 병행해야 했기 때문에 시간 분배가 필요했고, 약 2-3개월 정도 소요되었다. 1. 왜 멀티모듈로 전환했나요?A. 코드 관리의 측면프로젝트가 다른 슈퍼앱처럼 엄청 방대한 사이즈는 아니지만 그렇다고 아주 작은 사이즈는 아니였다.컨벤션이 없는 상태에서 많은 사람들의 손을 거쳐왔고, 네이티브로 구현된 많은 기능과 코드가 존재했다.따라서 IntelliSense(코드 자동완성) 도 느렸고 빌드도 느리고 모든게 다 느려 생산성이 떨어진다 생각이 들었다.거기에 올해 예정되어있는 많은 추가 개발 기능 건 들은 나의 마음을 답답하게 만들었다.B. SwiftUI 도입 추진SwiftUI가 출시된..

최근에 진행한 Weave 프로젝트를 진행하면서 Custom Alert을 구현할 기회가 있었다. UIKit에서의 Custom Alert이 아닌, SwiftUI 환경에서의 Alert은 첫 구현이라 어떨지 궁금했고, 결과적으로 UIKit보다 더욱 간편하게 구현이 가능했다.또한 어떻게 SwiftUI스럽게 구현할 수 있을지 고민해보았다. 1. 디자인 요구사항디자인 에서 요구되는 Alert은 이러한 모습이다. 위 요구사항을 다음과 같이 분석해 코드에 옮기기로 했다. 2. 뷰 구성하기public struct WeaveAlert: View { @Binding var isPresented: Bool let title: String var message: String? let prima..

리스트 형태의 뷰는 모바일 개발자라면 많이 만들게 되는 뷰일 것이다.기존 UIKit에서는 UITableView 로 만들게 되었는데,SwiftUI 에서도 UIKit과 메뉴를 관리하는 방식이 크게 다르지 않았다. 아래와 같이 프로필 뷰에 섹션과 메뉴가 있는 형태다. (이하 섹션, 메뉴) 이러한 구현할 때, 뷰를 일일이 나열할 수도 있지만나는 UIKit에서부터 이러한 뷰는 enum 으로 만들어 관리하는걸 좋아한다.SwiftUI에서도 enum 으로 관리했다. 1. Category & SubView(menu) Enumenum MyPageCategoryTypes: CaseIterable { case contactPoint case myPrfile case universityVerification ..

서비스 운영할 때는 대부분 develope, production (or Staging) 서버를 함께 운영한다. dev 에서 테스트하고 추가한 기능들을 릴리즈에 맞춰서 prod로 옮기는 방식일텐데, 서버의 URL이 달라지므로 클라이언트에서는 이 부분에 대한 처리가 필요하다. 방법은 여러가지가 있겠지만 이번에 사용한 방법은 Target을 분리하고, Schem에 따라 처리가 되도록 구현했다. 진행한 프로젝트는 Tuist를 사용했기 때문에 Tuist Manifest에서 설정을 시작한다. 1. Tuist Manifest - Build Setting public enum AppEnviroment: String { case dev case prod } public func setEnviroment(to env: Ap..

약 두달정도 사이드 프로젝트 팀 'WEAVE'에 들어가 열심히 프로젝트를 진행했다. 프로젝트 진행 중 예상치 못하게 그라데이션에서 고민했던 부분이 있어서 글로 남겨보려고 한다. 디자인 요구사항은 이러했다. 그라데이션이 이어지는 형태의 Stepper 다. 하지만 저 디자인을 코드로 옮기려니 그라데이션 부분에서 쉽지 않았다. 일단 Setpper 를 구현해보자. Stepper 구현 public struct WeaveStepper: View { let maxStepCount: Int let currentStep: Int public init( maxStepCount: Int, currentStep: Int ) { self.maxStepCount = maxStepCount self.currentStep = cur..

담당하는 프로젝트에서는 Toast 메시지를 띄우기 위해 라이브러리를 사용하고 있었다. 이런 저런 이유로 기존 사용하던 라이브러리를 들어내기로 했고, 직접 만들지 혹은 다른 라이브러리를 찾아볼지 고민을 하다 새로운 느낌의 toast 라이브러리를 시범 적용해보기로 했다. release가 꾸준히 되고 있으며, 너무 레거시하지 않은 라이브러리를 찾고 있었다. 그렇게 찾은 라이브러리는 iOS 기본 스타일의 메시지를 띄워주는 "toast-swift" 라는 녀석이다. https://github.com/BastiaanJansen/toast-swift 그렇게 새로운 느낌의 toast를 적용했는데, 조그만 문제가 있었다. 토스트가 뜨는 버튼을 유저가 여러번 누를수도 있다. 그렇게 된다면 여러개의 토스트 뷰가 겹쳐서 뜨게..

연말에 전혀 예상하지 못한 오류가 보고되었다. 유저는 분명 2023년 12월 31일을 선택했는데, 2024년 12월 31일 로 나오는 이슈가 있었다. 시간이 바뀌거나 하루 단위면 UTC 관련 이겠구나 싶었는데, 다른 날짜들은 모두 정상이였고, 연도가 바뀌는 현상은? 아무런 생각도 들지 않고 감도 못잡았다. 결론부터 말하자면, 간단한 오타에 의한 이슈였다. DateFormatter DateFormatter는 서비스 영역에서 너무나 자주 만나게되는 고마운 녀석이다. "yyyyMMddHHmmss" 형식을 관례적으로 늘 자주 사용하다보니 dateFormat 이 문제일줄은 몰랐다. 눈을 씻고 기존에 (누군가) 작성해둔 코드를 찾아보니 yyyy가 소문자가 아닌 대문자 YYYY 로 되어 있었고, 여기서, yyyy 와..

최근 회사에서 Watch App을 만들게 되어 열심히 만들고 있다. Watch App을 간단히 살펴 보자면 - 이전에는 UIKit으로도 만들 수 있었는데, 이제는 SwiftUI로 안만들 이유가 없을 듯 하고, - 폰에서 데이터 전송이 대부분 필요할텐데, shared UserDefaults 가 아닌 Watch Connectivity를 통한 전달이 필요하다. UIKit만 바라보던 나는 미뤄두던 SwiftUI를 이참에 공부를 했고 (이건 신세계..) Watch Connectivity에 대해 공부를 했었다. 본 포스트에서는 개념보다는 WatchApp을 만들어 가면서 만났던 이슈에 대해 정리를 해보려고 한다. 1. Watch OS 버전 개발을 위해 회사에서 지급받은 워치5는 무려 9.6.3 버전이다. (23년 9..

내가 구현하는 FLO 앱의 두가지 뷰에는 모두 가사가 들어있으며, 시간에 맞춰 자동으로 스크롤된다. Player 뷰 에서는 두줄을 보여주며 스크롤 되며, 가사 영역을 터치할 경우 가사가 크게 나온다. 1. 기능 분석 플레이어 뷰(좌측) - 오토 스크롤 - 하이라이팅(흰 글씨) - 가운데 정렬 - 유저 터치시 가사뷰로 이동 가사 뷰(우측) - 오토 스크롤 - 하이라이팅(흰 글씨) - 좌측 정렬 - 유저 터치시 해당 영역으로 플레이어 이동 - 유저의 스크롤도 가능 - 가사 컨트롤 버튼 존재 플레이어 뷰의 기능에서 더 확장된 것이 가사 뷰 라고 할 수 있겠다. 동일한 클래스를 사용할 수 있도록 LyricTableView를 만들고, 각 뷰별로 해당하는 옵션을 넣어주도록 하자. 2. 모델 만들기 먼저 테이블 뷰에..
- Total
- Today
- Yesterday
- Xcode15
- keyboardtype
- watch connectivity
- 맥북에어 m4
- string catalog
- audio kit
- 애플워치 데이터 전송
- swiftui 탭
- DateFormatter
- swift audio
- ios웹소켓
- openapi-generator
- ios채팅
- self-hosted-runner
- AVFoundation
- demical
- highprioritygesture
- avplayer
- Swift
- IOS
- ios 다국어
- swift날짜
- SwiftUI
- Github action
- audiokit
- onTapGesture
- flo
- swiftui 제스처
- open-api-generator
- easy cue
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |