플러팅 AI/React-native
구매 복원 기능 요약
Solo.dev
2025. 1. 14. 22:51
구매 복원 기능 요약
문제
- 사용자가 앱을 삭제 후 다시 설치하거나 새로운 기기에서 로그인했을 때, 구독 상태(isUnlimited)가 유지되지 않음.
- 복원 버튼을 눌러 구독을 복원했지만, 앱을 재실행해야 상태가 반영되는 문제가 발생.
해결 방법
- 구독 복원 기능 구현:
- RNIap.getAvailablePurchases()를 사용하여 복원 가능한 구매 내역을 확인.
- 복원 가능한 구매 항목에서 productId를 기반으로 구독 상태 확인.
- 앱 재실행 기능 추가:
- 복원 완료 후 앱을 재실행하여 구독 상태가 즉시 반영되도록 구현.
- 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('복원 실패', '복원 중 오류가 발생했습니다.');
}
};
동작 흐름
- 복원 요청:
- 사용자가 복원 버튼을 클릭.
- 구독 상태 확인:
- RNIap.getAvailablePurchases()로 구매 내역 조회.
- 구독 복원 처리:
- 해당 구독(productId)을 확인하고 로컬 상태(isUnlimited) 업데이트.
- 앱 재실행:
- 복원 성공 후 앱을 재실행하여 UI 즉시 반영.
결과
- 앱 삭제 후 다시 설치해도 복원 버튼을 통해 구독 상태를 유지 가능.
- 복원 성공 후 앱 재실행으로 사용자 경험 개선.
- 문제 없이 구독 복원이 동작하며 상태가 즉시 반영됨.
추가적인 질문이 있다면 언제든지 말씀해주세요! 😊