플러팅 AI/React-native

구매 복원 기능 요약

Solo.dev 2025. 1. 14. 22:51

구매 복원 기능 요약


문제

  • 사용자가 앱을 삭제 후 다시 설치하거나 새로운 기기에서 로그인했을 때, 구독 상태(isUnlimited)가 유지되지 않음.
  • 복원 버튼을 눌러 구독을 복원했지만, 앱을 재실행해야 상태가 반영되는 문제가 발생.

해결 방법

  1. 구독 복원 기능 구현:
    • RNIap.getAvailablePurchases()를 사용하여 복원 가능한 구매 내역을 확인.
    • 복원 가능한 구매 항목에서 productId를 기반으로 구독 상태 확인.
  2. 앱 재실행 기능 추가:
    • 복원 완료 후 앱을 재실행하여 구독 상태가 즉시 반영되도록 구현.
  3. UI 개선:
    • 복원 성공 시 사용자에게 알림을 표시하고 앱을 자동으로 재실행.

최종 코드

restorePurchase 함수

import { Alert, Platform, Linking } from 'react-native';
import * as RNIap from 'react-native-iap';
import AsyncStorage from '@react-native-async-storage/async-storage';

const productId = Platform.select({
  ios: 'com.flirtingai.subscribe_monthly',
  android: 'subscribe_01',
});

export const restorePurchase = async () => {
  try {
    console.log('구독 복원 시작');

    // IAP 연결 초기화
    const connected = await RNIap.initConnection();
    if (!connected) {
      throw new Error('IAP 연결 실패');
    }

    // 사용 가능한 구매 내역 가져오기
    const purchases = await RNIap.getAvailablePurchases();
    console.log('복원 가능한 구매 내역:', JSON.stringify(purchases, null, 2));

    if (!purchases || purchases.length === 0) {
      Alert.alert('복원 실패', '복원할 구독이 없습니다.');
      return false;
    }

    // 활성 구독 확인
    const restoredPurchase = purchases.find(
      (purchase) => purchase.productId === productId
    );

    if (!restoredPurchase) {
      Alert.alert('복원 실패', '활성화된 구독을 찾을 수 없습니다.');
      return false;
    }

    console.log('구독 복원된 데이터:', restoredPurchase);

    // 구독 상태를 AsyncStorage에 저장
    await AsyncStorage.setItem('isUnlimited', 'true');
    Alert.alert(
      '복원 완료',
      '구독이 성공적으로 복원되었습니다! 앱을 다시 시작합니다.',
      [
        {
          text: '확인',
          onPress: () => {
            // 앱 재실행 (iOS: Linking.openURL, Android: DevSettings.reload)
            if (Platform.OS === 'ios') {
              Linking.openURL('app-settings:');
            } else {
              DevSettings.reload();
            }
          },
        },
      ]
    );
    return true;
  } catch (error) {
    console.error('구독 복원 오류:', error);

    let errorMessage = '구독 복원 중 오류가 발생했습니다.';
    if (error.message.includes('network')) {
      errorMessage = '네트워크 문제로 구독을 복원할 수 없습니다.';
    }

    Alert.alert('복원 실패', errorMessage);
    return false;
  }
};

 


MainScreen에서 호출


const handleRestorePurchase = async () => {
  try {
    const restored = await restorePurchase();
    if (restored) {
      console.log('구매 복원이 완료되었습니다.');
    }
  } catch (error) {
    console.error('복원 실패:', error);
    Alert.alert('복원 실패', '복원 중 오류가 발생했습니다.');
  }
};

동작 흐름

  1. 복원 요청:
    • 사용자가 복원 버튼을 클릭.
  2. 구독 상태 확인:
    • RNIap.getAvailablePurchases()로 구매 내역 조회.
  3. 구독 복원 처리:
    • 해당 구독(productId)을 확인하고 로컬 상태(isUnlimited) 업데이트.
  4. 앱 재실행:
    • 복원 성공 후 앱을 재실행하여 UI 즉시 반영.

결과

  • 앱 삭제 후 다시 설치해도 복원 버튼을 통해 구독 상태를 유지 가능.
  • 복원 성공 후 앱 재실행으로 사용자 경험 개선.
  • 문제 없이 구독 복원이 동작하며 상태가 즉시 반영됨.

추가적인 질문이 있다면 언제든지 말씀해주세요! 😊