Skip to content

앱 필수 업데이트 버전을 iTunes Lookup API 조회로 자동화한다 #765

Description

@opficdev

배경

현재 필수 업데이트 기준은 Firebase Remote Config의 ios_required_version을 운영자가 직접 변경하는 방식이다.

App Store 공개 버전을 자동으로 조회하도록 전환하고, 고정된 조회 URL의 캐시 재사용을 줄이기 위해 요청 시각을 쿼리에 추가할 필요가 있다.

이 변경 이후 iTunes Lookup API 응답 버전이 필수 업데이트 활성화 기준이 되므로, #763 배포 순서의 ios_required_version 수동 상향 단계도 함께 수정할 필요가 있다.

목표

  • Release에서 App Store 공개 버전을 자동 조회하는 필수 업데이트 판단
  • DebugStaging에서 버전 조회 요청과 업데이트 알림 비활성화
  • Firebase Remote Config 기반 버전 관리와 FirebaseRemoteConfig 의존성 제거
  • 기존 실행당 한 번 확인, 필수 업데이트 알림, 실패 시 앱 사용 허용 흐름 유지

환경별 설정

URL은 기존 정책에 따라 xcconfig에서 관리한다.

APP_STORE_LOOKUP_URL =
APP_STORE_LOOKUP_URL[config=Release] = https:/$()/itunes.apple.com/lookup?id=6760288611&country=KR
  • Debug: 빈 값
  • Staging: 빈 값
  • Release: 한국 storefront의 iTunes Lookup API URL
  • APP_STORE_URL: 업데이트 버튼 이동용 기존 값 유지
  • Info.plist: APP_STORE_LOOKUP_URL$(APP_STORE_LOOKUP_URL)로 전달
  • 비공개 설정 저장소의 resources/DevLog/Config.xcconfig와 로컬 설정 반영

작업 범위

Infra

  • RemoteConfigAppVersionServiceImpl을 iTunes Lookup API 조회 구현으로 교체
  • 설정된 APP_STORE_LOOKUP_URL을 기준으로 요청 URL 구성
  • 조회할 때마다 Unix 초 단위 timestamp 쿼리 추가
  • 기존 id, country 쿼리를 보존하는 URLComponents 기반 구성
  • HTTP 응답과 JSON의 results.first.version 해석
  • 빈 URL, 미치환된 설정값, 통신 실패, 성공 범위가 아닌 상태 코드, 잘못된 JSON, 빈 결과 처리
  • Remote Config 전용 구현명과 오류명 정리
  • InfraAssembler 등록 구현 교체

Data

  • 기존 service와 repository 경계 유지
  • App Store 공개 버전 조회 역할에 맞지 않는 Remote Config 전용 명칭 정리
  • 조회된 버전 문자열을 Domain으로 전달

Domain

  • App Store versionCFBundleShortVersionString 비교
  • CFBundleVersion을 버전 비교에서 제외
  • 현재 마케팅 버전이 App Store 공개 버전보다 낮을 때만 업데이트 필요 반환
  • 숫자 구성 요소 기반 기존 비교 방식 유지

Presentation

  • RootFeature의 로그인 상태와 무관한 실행당 한 번 확인 유지
  • 기존 필수 업데이트 알림과 APP_STORE_URL 이동 흐름 유지
  • 조회 또는 버전 해석 실패 시 알림 없이 앱 사용 허용
  • 앱 활성화 복귀에 따른 추가 조회 미도입

의존성 및 운영 절차

실패 처리

다음 조건에서는 업데이트가 필요하지 않은 것으로 처리하고 기존 앱 사용을 허용한다.

  • APP_STORE_LOOKUP_URL 누락 또는 빈 값
  • $(APP_STORE_LOOKUP_URL) 미치환
  • URL 구성 실패
  • 네트워크 요청 실패
  • 성공 범위가 아닌 HTTP 상태 코드
  • 응답 해석 실패
  • results가 비어 있는 응답
  • App Store 버전 또는 현재 버전 형식 오류

Remote Config를 대체 경로로 사용하지 않는다.

완료 조건

  • DebugStaging에서 iTunes Lookup API 요청 및 업데이트 알림이 발생하지 않음
  • Release에서 설정된 App ID와 KR storefront로 조회
  • 각 조회 URL에 요청 시점의 timestamp 포함
  • 현재 CFBundleShortVersionString이 App Store 버전보다 낮을 때 기존 필수 업데이트 알림 표시
  • 두 마케팅 버전이 같거나 현재 버전이 더 높을 때 알림 미표시
  • CFBundleVersion 차이가 업데이트 판단에 영향을 주지 않음
  • 조회와 응답 처리 실패 시 앱 사용 가능
  • 반복된 RootFeature.onAppear에도 실행당 조회 한 번 유지
  • 업데이트 버튼이 기존 APP_STORE_URL을 사용
  • FirebaseRemoteConfig 제품 의존성과 ios_required_version 사용 제거
  • Google 인증을 GoogleSignIn serverAuthCode 흐름으로 전환한다 #763 배포 순서 갱신

테스트 및 검증

  • AppVersion의 낮은 버전, 같은 버전, 높은 버전, 구성 요소 수 차이, 잘못된 형식 단위 테스트
  • CheckAppUpdateUseCaseImpl의 마케팅 버전 비교와 build number 제외 단위 테스트
  • iTunes 응답 성공, 빈 결과, 잘못된 JSON, 통신 실패, HTTP 오류 단위 테스트
  • timestamp 추가와 기존 쿼리 보존 단위 테스트
  • 빈 설정값에서 네트워크 요청이 발생하지 않는 단위 테스트
  • RootFeature의 실행당 한 번 확인, 필수 알림, 실패 시 허용 회귀 테스트
  • 변경된 Swift 파일의 SwiftLint 통과
  • mise exec -- tuist generate --no-open 통과
  • DevLog.xcworkspaceApp scheme build-only 검증 통과
  • 관련 테스트 target의 build-for-testing 통과
  • 생성된 build setting에서 Debug·Staging의 빈 값과 Release의 Lookup URL 확인

제외 범위

  • 업데이트 알림 UI와 문구 변경
  • 선택 업데이트 흐름 추가
  • 앱 활성화 복귀마다 재조회
  • APP_STORE_URL 변경
  • 앱 또는 Simulator 실행을 통한 검증

참고

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions