DateP

구독 복구 로직 보강

Solo.dev 2025. 5. 7. 00:58
DateP 구독 로직 개선 요약

구독 복원 로직 개선 및 안정화 작업 요약 (Android 기준)

핵심 목표 및 접근 방식

  • 목표: 앱 재설치 시 새로운 Firebase UID가 발급되어도, 기존 구독 상태와 남은 사용 횟수(remainingUses)를 정확하게 복원하고 유지하는 것.
  • 주요 접근 방식:
    • 영구적 구독 식별자 활용: Android의 obfuscatedAccountIdAndroid (OAAID)를 Firebase DB 내 subscriptions/ 경로에서 구독 정보의 고유 키로 사용. 이를 통해 실제 구매 건 데이터를 중앙 관리.
    • Firebase UID - OAAID 매핑: 앱 재설치로 새 Firebase UID 발급 시, 복원 과정에서 이 새 UID와 기존 구매 건의 OAAID를 users/{firebaseUid} 경로에 연결. 이를 통해 새 UID 사용자도 이전 구독 정보에 접근 가능.

주요 파일별 수정 사항 및 로직

  1. SubscriptionProvider.tsx (useEffect 훅 안정화):
    • 목적: Firebase Cloud Function (restorePurchaseHandler) 호출 시 발생하던 "인증 필요" 오류 해결.
    • 변경점:
      • useEffect 의존성 배열에서 userId 제거, onAuthStateChanged 리스너 중복 실행 방지.
      • onAuthStateChanged 콜백 내 로컬 변수(currentFirebaseUid) 사용하여 실제 UID 변경 시에만 구독 상태 확인 로직(loadAndCheckSubscriptionStatus) 실행.
      • 익명 로그인(signInAnonymously) 성공 후, onAuthStateChanged가 새 사용자로 다시 호출되어 인증된 컨텍스트에서 후속 작업 진행 보장. Cloud Function 호출 시 ID 토큰 첨부 가능성 증대.
  2. startPurchase.ts (구매 및 복원 로직 핵심):
    • restorePurchase 함수:
      • 인자로 받는 subscriptionIdentifier가 Android의 OAAID임을 명확히 함.
      • Firebase DB에 undefined 값 저장 시도 방지.
      • 함수 내 불필요한 자체 인증 로직 제거, SubscriptionProvider로부터 전달받는 firebaseUid 및 SDK 전역 인증 상태 신뢰.
    • checkSubscriptionStatus 함수:
      • restorePurchase 호출 시 Android의 OAAID를 정확히 전달.
      • Firebase DB 저장/업데이트 시 사용할 키(finalSubscriptionIdentifierForDB) 관리 명확화.
      • 구독 갱신 시 스토어 정보와 Firebase DB 동기화 로직 개선, remainingUsescheckAndResetUsage 통해 관리.
  3. restorePurchaseHandler.ts (Firebase Cloud Function):
    • 클라이언트에서 전달받은 OAAID를 subscriptionKey로 사용하여 subscriptions/ 데이터 조회 및 업데이트.
    • 핵심 로직: newUserId(호출자 Firebase UID)와 OAAID를 users/ 경로에 매핑하여 새 UID와 기존 구매 건 연결.
    • 호출자 인증 확인, 필수 데이터 검증 로직 포함.

기대 효과 및 현재 상태

  • 앱 재설치 후 새 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+의 뒤로 가기 제스처 관련 설정이며, 현재 인증 오류와는 직접적인 관련이 없습니다. (앱 완성도를 위해 추후 적용 권장)