React Native 프로젝트에서 In-App Purchase(IAP)를 구현하면서 발생했던 iOS 구독 결제 문제를 해결한 과정을 공유합니다. react-native-iap 라이브러리를 사용하면서, 잘못된 접근으로 인해 구독 항목 로드 및 결제 요청이 실패했던 문제를 분석하고, 올바른 접근 방식으로 문제를 해결했습니다.
1. IAP 초기화
문제 상황
IAP 초기화 과정에서 구독 항목을 불러오는 코드에서 getSubscriptions 함수에 잘못된 파라미터를 전달하여 오류가 발생했습니다.
잘못된 접근
const subscriptions = await RNIap.getSubscriptions(skus);
- skus를 배열 형태로 직접 전달했지만, 최신 react-native-iap에서는 객체로 전달해야 합니다.
올바른 접근
const subscriptions = await RNIap.getSubscriptions({ skus });
- skus를 객체 형태로 전달해야 구독 항목이 정상적으로 로드됩니다.
2. 구독 요청
문제 상황
구독 결제 요청에서 requestSubscription 함수에 잘못된 파라미터 형식을 전달하여 구독 창이 열리지 않는 문제가 발생했습니다.
잘못된 접근
const purchase = await RNIap.requestSubscription(purchaseParams);
- purchaseParams가 올바른 객체 형식이 아니라 오류를 유발했습니다.
올바른 접근
const purchase = await RNIap.requestSubscription({ sku: productId });
- sku를 명시적으로 포함한 객체 형태로 전달해야 합니다.
3. 트랜잭션 완료 처리
문제 상황
구독 결제가 성공적으로 이루어진 후에도 finishTransaction을 호출하지 않아 트랜잭션이 "미완료 상태"로 남는 문제가 발생했습니다. 이는 Apple의 서버에서 결제 처리가 완료되지 않아 앱 동작과 사용자 경험에 문제를 일으켰습니다.
올바른 처리
await RNIap.finishTransaction({ purchase });
- 이 코드는 Apple 서버에 결제가 성공적으로 완료되었음을 알리고, 트랜잭션 큐에서 해당 트랜잭션을 제거합니다.
- 호출하지 않으면 동일한 트랜잭션이 반복적으로 처리될 수 있습니다.
최종 코드
아래는 수정된 최종 코드입니다. react-native-iap의 최신 사용 방식을 적용하여 문제를 해결했습니다.
import * as RNIap from 'react-native-iap';
const productId = 'com.example.subscribe_monthly';
export const handlePurchase = async () => {
try {
// IAP 초기화
await RNIap.initConnection();
// SKU 배열 생성 및 구독 항목 로드
const skus = [productId];
const subscriptions = await RNIap.getSubscriptions({ skus });
if (!subscriptions || subscriptions.length === 0) {
console.log('구독 상품 없음');
return;
}
// 구독 요청
const purchase = await RNIap.requestSubscription({ sku: productId });
if (purchase) {
// 트랜잭션 완료 처리
await RNIap.finishTransaction({ purchase });
console.log('구독 완료!');
}
} catch (error) {
console.error('Purchase error:', error);
}
};
결론
- IAP 초기화 시 getSubscriptions 함수에 객체로 파라미터 전달.
- 구독 요청 시 requestSubscription에 sku를 명시적으로 포함한 객체 전달.
- 결제 성공 후 finishTransaction을 호출하여 트랜잭션을 완료.
'플러팅 AI > React-native' 카테고리의 다른 글
| Android IAP 사용 시 NullPointerException 에러 해결 방법 (0) | 2025.01.14 |
|---|---|
| Firebase를 통한 Google 로그인이 내부 테스트 트랙에서 작동하지 않는 문제 (0) | 2025.01.11 |
| RN 으로 짠 Modal 이 android 에서는 잘만 작동하다가 IOS는 이유 (0) | 2024.12.26 |
| React Native에서 iOS 문제 해결 가이드 (1) | 2024.12.20 |
| React Native에서 "IAP Initialization error: 'skus' is required" 오류 해결 방법 (1) | 2024.12.20 |