배경
현재 필수 업데이트 기준은 Firebase Remote Config의 ios_required_version을 운영자가 직접 변경하는 방식이다.
App Store 공개 버전을 자동으로 조회하도록 전환하고, 고정된 조회 URL의 캐시 재사용을 줄이기 위해 요청 시각을 쿼리에 추가할 필요가 있다.
이 변경 이후 iTunes Lookup API 응답 버전이 필수 업데이트 활성화 기준이 되므로, #763 배포 순서의 ios_required_version 수동 상향 단계도 함께 수정할 필요가 있다.
목표
Release에서 App Store 공개 버전을 자동 조회하는 필수 업데이트 판단
Debug와 Staging에서 버전 조회 요청과 업데이트 알림 비활성화
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 version과 CFBundleShortVersionString 비교
CFBundleVersion을 버전 비교에서 제외
현재 마케팅 버전이 App Store 공개 버전보다 낮을 때만 업데이트 필요 반환
숫자 구성 요소 기반 기존 비교 방식 유지
Presentation
RootFeature의 로그인 상태와 무관한 실행당 한 번 확인 유지
기존 필수 업데이트 알림과 APP_STORE_URL 이동 흐름 유지
조회 또는 버전 해석 실패 시 알림 없이 앱 사용 허용
앱 활성화 복귀에 따른 추가 조회 미도입
의존성 및 운영 절차
실패 처리
다음 조건에서는 업데이트가 필요하지 않은 것으로 처리하고 기존 앱 사용을 허용한다.
APP_STORE_LOOKUP_URL 누락 또는 빈 값
$(APP_STORE_LOOKUP_URL) 미치환
URL 구성 실패
네트워크 요청 실패
성공 범위가 아닌 HTTP 상태 코드
응답 해석 실패
results가 비어 있는 응답
App Store 버전 또는 현재 버전 형식 오류
Remote Config를 대체 경로로 사용하지 않는다.
완료 조건
Debug와 Staging에서 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.xcworkspace의 App scheme build-only 검증 통과
관련 테스트 target의 build-for-testing 통과
생성된 build setting에서 Debug·Staging의 빈 값과 Release의 Lookup URL 확인
제외 범위
업데이트 알림 UI와 문구 변경
선택 업데이트 흐름 추가
앱 활성화 복귀마다 재조회
APP_STORE_URL 변경
앱 또는 Simulator 실행을 통한 검증
참고
배경
현재 필수 업데이트 기준은 Firebase Remote Config의
ios_required_version을 운영자가 직접 변경하는 방식이다.App Store 공개 버전을 자동으로 조회하도록 전환하고, 고정된 조회 URL의 캐시 재사용을 줄이기 위해 요청 시각을 쿼리에 추가할 필요가 있다.
이 변경 이후 iTunes Lookup API 응답 버전이 필수 업데이트 활성화 기준이 되므로, #763 배포 순서의
ios_required_version수동 상향 단계도 함께 수정할 필요가 있다.목표
Release에서 App Store 공개 버전을 자동 조회하는 필수 업데이트 판단Debug와Staging에서 버전 조회 요청과 업데이트 알림 비활성화FirebaseRemoteConfig의존성 제거환경별 설정
URL은 기존 정책에 따라
xcconfig에서 관리한다.Debug: 빈 값Staging: 빈 값Release: 한국 storefront의 iTunes Lookup API URLAPP_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 구성timestamp쿼리 추가id,country쿼리를 보존하는URLComponents기반 구성results.first.version해석InfraAssembler등록 구현 교체Data
Domain으로 전달Domain
version과CFBundleShortVersionString비교CFBundleVersion을 버전 비교에서 제외Presentation
RootFeature의 로그인 상태와 무관한 실행당 한 번 확인 유지APP_STORE_URL이동 흐름 유지의존성 및 운영 절차
Infra의FirebaseRemoteConfig제품 의존성 제거ios_required_version사용 제거실패 처리
다음 조건에서는 업데이트가 필요하지 않은 것으로 처리하고 기존 앱 사용을 허용한다.
APP_STORE_LOOKUP_URL누락 또는 빈 값$(APP_STORE_LOOKUP_URL)미치환results가 비어 있는 응답Remote Config를 대체 경로로 사용하지 않는다.
완료 조건
Debug와Staging에서 iTunes Lookup API 요청 및 업데이트 알림이 발생하지 않음Release에서 설정된 App ID와KRstorefront로 조회timestamp포함CFBundleShortVersionString이 App Store 버전보다 낮을 때 기존 필수 업데이트 알림 표시CFBundleVersion차이가 업데이트 판단에 영향을 주지 않음RootFeature.onAppear에도 실행당 조회 한 번 유지APP_STORE_URL을 사용FirebaseRemoteConfig제품 의존성과ios_required_version사용 제거테스트 및 검증
AppVersion의 낮은 버전, 같은 버전, 높은 버전, 구성 요소 수 차이, 잘못된 형식 단위 테스트CheckAppUpdateUseCaseImpl의 마케팅 버전 비교와 build number 제외 단위 테스트timestamp추가와 기존 쿼리 보존 단위 테스트RootFeature의 실행당 한 번 확인, 필수 알림, 실패 시 허용 회귀 테스트mise exec -- tuist generate --no-open통과DevLog.xcworkspace의Appscheme build-only 검증 통과build-for-testing통과Debug·Staging의 빈 값과Release의 Lookup URL 확인제외 범위
APP_STORE_URL변경참고