twix://notification/[type] 형태의 딥링크를 enum으로 매핑하고, Coordinator에서 화면
전환을 처리했습니다.
단순 테스트에서는 문제가 없었습니다. 문제는 실제 사용 환경이었습니다. 커플이 초대 링크를 전달할 때 카카오톡이나 Instagram 같은 외부 서비스를 쓰면 링크가 WebView로 열립니다. 이 환경에서는 AASA가 읽히지 않아 Universal Link가 동작하지 않았고, 결국 앱으로 진입할 수 없었습니다.
그래서 구조를 바꿨습니다. 랜딩페이지를 따로 두고, 거기서 Custom App Scheme으로 앱을 여는 방식으로 우회했습니다. 처음 설계했던 Universal Link 중심 구조를 그대로 밀기보다, 실제 사용 흐름에서 더 잘 동작하는 방식으로 바꾸는 게 맞다고 판단했습니다.
@Autowired에서 아이디어를 얻어 의존성을 자동으로 resolve하는 DI Container를
만들었습니다. 네트워크 레이어는 URLSession 기반으로 일반 API와 OAuth 흐름을 나눠 구성했습니다.
심사 거절을 받고 Apple에 기획 의도를 설명하며 재검토를 요청했습니다. 도서 검색 데이터가 외부 서비스에 의존하는 구조라 회원에게만 제공하는 게 합리적이라고 판단했고,
그 근거도
전달했습니다.
하지만 Apple은 HIG 기준을 이유로 변경 없이는 승인하지 않겠다고 했습니다.
결국 받아들이기로 했습니다. 출시를 위해서는 선택지가 없었고, 서버 팀과 함께 구조를 바꿨습니다. 기획 의도를 끝까지 밀고 가는 것보다, 출시 가능한 구조로 바꾸는 게 맞다고 판단했습니다.
독서 기록 등록 화면을 처음엔 세로 ScrollView 안에 가로 ScrollView를 넣는 구조로 설계했습니다. 단계별로 컨텐츠 높이가 달라 StackView가 높이를 계산하지 못했고,
작은 디바이스에서는 UI가 잘리거나 페이징이 동작하지 않았습니다.
구조를 반대로 바꿨습니다. 바깥을 가로 페이징 ScrollView로 두고, 내부를 페이지별 세로 ScrollView로 다시 설계했습니다. 페이지마다 높이를 독립적으로 가져가면서
문제가
해결됐고,
처음 설계를 고수하기보다 구조를 다시 짜는 편이 더 빠른 선택이었습니다.
감정에 맞는 음악 추천 기능을 Spotify API 기준으로 설계하고 구현하던 중, 사용하던 엔드포인트가 갑자기 동작하지 않았습니다. 확인해보니 Spotify가 해당 API 지원을 종료한 상태였습니다.
대안을 찾아봤지만, 우리 앱이 원했던 건 단순 플레이리스트 추천이 아니라 미세한 감정값에 따라 적절한 음원을 고르는 기능이었습니다. 그 수준의 데이터를 안정적으로 제공하는 대안은 찾기 어려웠고, 억지로 비슷한 기능을 남기기보다 해당 기능을 제거하는 편이 맞다고 판단했습니다.
이 경험 이후에는 외부 API를 고를 때 기능 자체만이 아니라, 대체 가능성과 백업 플랜까지 같이 보게 됐습니다.