구독 복원 로직 개선 및 안정화 작업 요약 (Android 기준)
핵심 목표 및 접근 방식
- 목표: 앱 재설치 시 새로운 Firebase UID가 발급되어도, 기존 구독 상태와 남은 사용 횟수(
remainingUses)를 정확하게 복원하고 유지하는 것. - 주요 접근 방식:
- 영구적 구독 식별자 활용: Android의
obfuscatedAccountIdAndroid(OAAID)를 Firebase DB 내subscriptions/경로에서 구독 정보의 고유 키로 사용. 이를 통해 실제 구매 건 데이터를 중앙 관리. - Firebase UID - OAAID 매핑: 앱 재설치로 새 Firebase UID 발급 시, 복원 과정에서 이 새 UID와 기존 구매 건의 OAAID를
users/{firebaseUid}경로에 연결. 이를 통해 새 UID 사용자도 이전 구독 정보에 접근 가능.
- 영구적 구독 식별자 활용: Android의
주요 파일별 수정 사항 및 로직
SubscriptionProvider.tsx(useEffect훅 안정화):- 목적: Firebase Cloud Function (
restorePurchaseHandler) 호출 시 발생하던 "인증 필요" 오류 해결. - 변경점:
useEffect의존성 배열에서userId제거,onAuthStateChanged리스너 중복 실행 방지.onAuthStateChanged콜백 내 로컬 변수(currentFirebaseUid) 사용하여 실제 UID 변경 시에만 구독 상태 확인 로직(loadAndCheckSubscriptionStatus) 실행.- 익명 로그인(
signInAnonymously) 성공 후,onAuthStateChanged가 새 사용자로 다시 호출되어 인증된 컨텍스트에서 후속 작업 진행 보장. Cloud Function 호출 시 ID 토큰 첨부 가능성 증대.
- 목적: Firebase Cloud Function (
startPurchase.ts(구매 및 복원 로직 핵심):restorePurchase함수:- 인자로 받는
subscriptionIdentifier가 Android의 OAAID임을 명확히 함. - Firebase DB에
undefined값 저장 시도 방지. - 함수 내 불필요한 자체 인증 로직 제거,
SubscriptionProvider로부터 전달받는firebaseUid및 SDK 전역 인증 상태 신뢰.
- 인자로 받는
checkSubscriptionStatus함수:restorePurchase호출 시 Android의 OAAID를 정확히 전달.- Firebase DB 저장/업데이트 시 사용할 키(
finalSubscriptionIdentifierForDB) 관리 명확화. - 구독 갱신 시 스토어 정보와 Firebase DB 동기화 로직 개선,
remainingUses는checkAndResetUsage통해 관리.
restorePurchaseHandler.ts(Firebase Cloud Function):- 클라이언트에서 전달받은 OAAID를
subscriptionKey로 사용하여subscriptions/데이터 조회 및 업데이트. - 핵심 로직:
newUserId(호출자 Firebase UID)와 OAAID를users/경로에 매핑하여 새 UID와 기존 구매 건 연결. - 호출자 인증 확인, 필수 데이터 검증 로직 포함.
- 클라이언트에서 전달받은 OAAID를
기대 효과 및 현재 상태
- 앱 재설치 후 새 Firebase UID로도 기존 구독 정보(OAAID 기준)를 올바르게 복원.
remainingUses등 구독 상태가 OAAID 중심으로 일관되게 관리.- 현재 문제점: 로그상 Firebase Cloud Function 호출 시 "인증 필요" 오류가 간헐적으로 발생. 이는
useEffect개선에도 불구하고, 익명 로그인 직후 또는 비동기 흐름 사이에서 SDK의 인증 상태(ID 토큰 발급 준비)가 Cloud Function 호출 시점까지 완전히 안정화되지 못했을 가능성을 시사. - 향후 조치: 인증 상태 전파 지연 문제 해결을 위한 추가 디버깅 (예:
user.getIdToken(true)를 통한 명시적 토큰 준비 상태 확인) 및 테스트 필요.
참고: AndroidManifest.xml 경고
- 로그에 보이는
Set 'android:enableOnBackInvokedCallback="true"' in the application manifest.경고는 Android 13+의 뒤로 가기 제스처 관련 설정이며, 현재 인증 오류와는 직접적인 관련이 없습니다. (앱 완성도를 위해 추후 적용 권장)
'DateP' 카테고리의 다른 글
| "DateP 프로젝트: Android 출시 및 iOS 최적화 작업 요약 - 2025년 5월 15일" (0) | 2025.05.15 |
|---|---|
| 크레딧 기반 구독 시스템 구축 여정 (0) | 2025.05.08 |
| 구독 시스템 문제 해결 및 Restore Function 개발 진행 상황 (0) | 2025.05.04 |
| 구독 상태 확인 로직 요약 (33 ,2.4) -05 01 (0) | 2025.05.01 |
| 구독 갱신 로직 android 에러 수정 (0) | 2025.04.28 |