정지용

iOS Developer

Keepiluv

커플 간의 공동 목표를 만들고, 사진으로 서로의 목표 달성을 공유하는 커플 앱

YAPP 27기 대상 App Store 출시
SwiftUI TCA Universal Link FCM xctrace / Instruments
Keepiluv 01

초대 링크 진입 개선

UT와 데모데이에서 초대 링크로 앱에 들어오는 과정이 매끄럽지 않다는 피드백이 있었습니다. 실제로는 카카오톡이나 인스타그램으로 초대 링크를 전달하는 경우가 많아, 대부분의 경우에는 초대 링크가 WebView에서 열려 이 환경에서는 Universal Link만으로 앱 진입을 보장하기 어려웠습니다.

그래서 랜딩 페이지에서 앱 실행을 한 번 더 시도하고, 설치되어 있지 않은 경우에는 App Store로 이어지도록 흐름을 나눴습니다.

  • 외부 앱에서 초대 링크 클릭
  • 랜딩 페이지에서 앱 실행 시도
  • 설치되어 있지 않으면 App Store로 이동
  • 앱으로 돌아오면 초대 코드 기반으로 온보딩 진행
https://keepiluv.teamtwix.com/invite?code=<invite_code>
Keepiluv 02

온보딩 상태 관리 개선

초대 코드를 입력한 뒤에도 사용자가 바로 다음 화면으로 넘어갈 수 있는 건 아니었습니다. 상대방이 아직 코드를 입력하지 않았다면 기다려야 했고, 이미 입력한 정보가 있다면 다시 받지 않는 편이 나았습니다.

그래서 온보딩을 고정된 화면 순서가 아니라 서버 상태값 기준으로 처리했습니다. 완료된 단계는 건너뛰고, 연결 대기 상태에서는 CodeInput에서 polling으로 상태 변화를 확인했습니다.

Keepiluv 03

버벅임 제보 이후의 성능 개선

출시 후 사용해본 팀원들과 주변 사용자에게서 특정 화면이 버벅인다는 피드백을 받았습니다.
특히 사진 인증 이후 코멘트를 남기는 구간과 홈 화면 스크롤에서 끊김이 반복적으로 언급됐습니다.

사진 인증은 저희 앱의 핵심 사용 흐름에 가까웠기 때문에, 이 구간의 끊김은 단순한 성능 이슈가 아니라 사용자가 흐름을 놓칠 수 있는 문제라고 봤습니다.
먼저 UITest seed, PerfProfile, xctrace/Instruments로 같은 조건을 다시 실행할 수 있게 만들고, 화면별로 before/after를 비교했습니다.

  • 같은 화면 조건 재현
  • xctrace/Instruments 측정
  • 화면별 before/after 비교

Performance

화면별 성능 개선 결과

아래 수치는 각각의 화면에서 비교한 결과입니다.

통계 화면 스크롤

Hitches 4/1/2 → 2/0/0

통계 화면을 같은 조건으로 스크롤하며 측정했습니다.
중복 렌더링을 줄인 뒤, hang은 1에서 0으로 줄었습니다.

xctrace / Instruments · 3회 반복 측정

사진 인증 후 코멘트 입력

0.82s → 0.53s

사진이 있는 상태에서 긴 입력을 하는 상황을 기준으로 봤습니다.
main-thread stall은 0.82초에서 0.53초로 줄었고, 가장 긴 hang은 232.67ms에서 114.00ms로 줄었습니다.

Hitches / Time Profiler

홈 화면 스크롤

2,642 → 166

홈 화면에서 목표 카드 렌더링이 반복되는 문제를 확인했습니다.
렌더링 호출은 2,642회에서 166회로 줄었고, SwiftUI updates는 40.7% 감소했습니다.

SwiftUI Template + Time Profiler + Animation Hitches

성능 파트에서 보여주고 싶은 건 수치 자체보다, 같은 조건으로 다시 재고 비교할 수 있는 구조를 먼저 만들었다는 점입니다.

Reed

문장과 감정을 함께 담는 독서 기록 플랫폼입니다.

YAPP 26기 최우수상 App Store 출시
UIKit Combine guest/member mode App Store Review
Reed 01

App Store 심사 대응

초기 구조에서는 로그인 전에는 앱의 주요 기능을 충분히 둘러보기 어려웠습니다.
Apple에 기획 의도를 설명했지만, App Store Review에서는 HIG 기준상 인증 없이도 핵심 경험 일부를 탐색할 수 있어야 한다는 피드백을 받았습니다.

그래서 접근 구조를 나눴습니다. 서버에서는 비회원 접근이 가능한 API 범위를 조정했고, iOS에서는 guest/member access mode를 분리했습니다. 검색처럼 먼저 둘러볼 수 있는 기능은 로그인 없이 열고, 기록 저장처럼 인증이 필요한 순간에만 login gate를 보여주도록 했습니다.

Before

로그인 후에만 주요 기능을 볼 수 있었습니다.

After

게스트 탐색과 회원 기능을 나눴습니다.

Heim

AI 기반 음성 일기 및 감정 분석 앱

Structured Concurrency Prompt injection External API risk Audio visualization