React-native-iap: purchaseUpdatedListener๊ฐ€ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ˜ธ์ถœ ๋จ

์— ๋งŒ๋“  2020๋…„ 02์›” 03์ผ  ยท  6์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: dooboolab/react-native-iap

react-native-iap ๋ฒ„์ „

4.3.0

๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฒ„์ „

0.60.5

์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ํ”Œ๋žซํผ (IOS ๋˜๋Š” Android ๋˜๋Š” ๋‘˜ ๋‹ค?)

์–‘์ž ๋ชจ๋‘

์˜ˆ์ƒ๋˜๋Š” ํ–‰๋™

์˜ˆ์ œ์— ๋”ฐ๋ผ ๊ตฌ๋…์„ ๊ตฌ๋งค ํ•œ ํ›„ ์‚ฌ์šฉ์ž ์ง€์ • ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ตฌ๋งค๋ฅผ ํ™•์ธํ•œ ํ›„ ์ฒญ์ทจ์ž๋ฅผ ์ œ๊ฑฐํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? remove ๋ช…์‹œ ์ ์œผ๋กœ ํ˜ธ์ถœํ–ˆ์ง€๋งŒ ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ

 const purchaseListener = purchaseUpdatedListener(purchase => {
      const receipt = purchase.transactionReceipt;
      if (receipt) {
        callCustomEndpoint().then(result => {
          if(result){
            // Subscription is valid
            finishTransaction(purchase);
          }
        }) 
      };
      finishTransaction(purchase);
    });

์‹ค์ œ ํ–‰๋™

callCustomEndpoint () ๋ฉ”์„œ๋“œ๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ผ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋กํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ์ด ๋์ ์„ ํ•œ ๋ฒˆ๋งŒ ๋ˆ„๋ฅด๋ฉด๋ฉ๋‹ˆ๋‹ค.

์ค‘์š”ํ•œ ๊ฒฝ์šฐ ํด๋ž˜์Šค ๊ตฌ์„ฑ ์š”์†Œ ๋Œ€์‹  ๊ธฐ๋Šฅ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ ๋œ ํ™˜๊ฒฝ (์—๋ฎฌ๋ ˆ์ดํ„ฐ? ์‹ค์ œ ์žฅ์น˜?)

์‹ค์ œ ์žฅ์น˜

ํ–‰๋™์„ ์žฌํ˜„ํ•˜๋Š” ๋‹จ๊ณ„

๐Ÿ™ help wanted

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋‚˜์ค‘์— ํ•„์š”ํ•  ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ๋‚ด ์†”๋ฃจ์…˜์„ ๋‚ด๋ ค ๋†“์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ƒํƒœ ๊ตฌ์„ฑ ์š”์†Œ ์™ธ๋ถ€ (๋‚ด๋ถ€์—์„œ๋„ ์ž‘๋™ ํ•  ์ˆ˜ ์žˆ์Œ) :

var purchaseUpdateSubscription;
var purchaseErrorSubscription;
const loadIAPListeners = () => {
  initConnection(); // important, or else it won't trigger before a random state change
  purchaseUpdateSubscription = purchaseUpdatedListener(
    async (
      purchase: InAppPurchase | SubscriptionPurchase | ProductPurchase,
    ) => {
      console.log('purchaseUpdatedListener', purchase);
      let receipt = purchase.transactionReceipt;
      if (receipt) {
        apis.checkreceipt({data: purchase, platform: Platform.OS}); // I personally don't care about callback
        if (Platform.OS === 'ios') {
          await RNIap.finishTransactionIOS(purchase.transactionId);
        } else if (Platform.OS === 'android') {
          await RNIap.acknowledgePurchaseAndroid(purchase.purchaseToken);
        }
        await RNIap.finishTransaction(purchase, true);
        await RNIap.finishTransaction(purchase, false);
      } else {
        // Retry / conclude the purchase is fraudulent, etc...
      }
    },
  );
  purchaseErrorSubscription = purchaseErrorListener((error: PurchaseError) => {
    console.log('purchaseErrorListener', error);
  });
};

์ƒํƒœ ๊ตฌ์„ฑ ์š”์†Œ ๋‚ด๋ถ€ :

useEffect(() => {
    loadIAPListeners();
    return () => {
      purchaseUpdateSubscription.remove();
      purchaseErrorSubscription.remove();
    };
  }, []);

๋ชจ๋“  6 ๋Œ“๊ธ€

๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋‹ค์‹œ ๋ Œ๋”๋ง ๋  ๋•Œ purchaseListener๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ๋“ฑ๋กํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ ๋งค ๋ Œ๋”์—์„œ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋„๋ก ํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์ด๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์‹ค์ˆ˜๋Š” ํด๋ž˜์Šค ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋ฌธ์„œ์—์„œ ์ œ๊ณต๋œ ์˜ˆ์ œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋Šฅ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ํฌํŒ…ํ•˜๋ ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋„์„œ๊ด€์—์„œ ์ž˜ํ•˜์…จ์Šต๋‹ˆ๋‹ค!

@cgathergood ๋‚˜๋„์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜์‘ ํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์ฝ”๋“œ๋ฅผ ๊ฒŒ์‹œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@cgathergood ์ฝ”๋“œ ์ƒ˜ํ”Œ๋„๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ฐˆ๊ณ ๋ฆฌ๋กœ ์•ฝ๊ฐ„ ๊ณ ๊ตฐ๋ถ„ํˆฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@ wootwoot1234 @osmantuna ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค๋ฉด ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋‚˜์ค‘์— ํ•„์š”ํ•  ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ๋‚ด ์†”๋ฃจ์…˜์„ ๋‚ด๋ ค ๋†“์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ƒํƒœ ๊ตฌ์„ฑ ์š”์†Œ ์™ธ๋ถ€ (๋‚ด๋ถ€์—์„œ๋„ ์ž‘๋™ ํ•  ์ˆ˜ ์žˆ์Œ) :

var purchaseUpdateSubscription;
var purchaseErrorSubscription;
const loadIAPListeners = () => {
  initConnection(); // important, or else it won't trigger before a random state change
  purchaseUpdateSubscription = purchaseUpdatedListener(
    async (
      purchase: InAppPurchase | SubscriptionPurchase | ProductPurchase,
    ) => {
      console.log('purchaseUpdatedListener', purchase);
      let receipt = purchase.transactionReceipt;
      if (receipt) {
        apis.checkreceipt({data: purchase, platform: Platform.OS}); // I personally don't care about callback
        if (Platform.OS === 'ios') {
          await RNIap.finishTransactionIOS(purchase.transactionId);
        } else if (Platform.OS === 'android') {
          await RNIap.acknowledgePurchaseAndroid(purchase.purchaseToken);
        }
        await RNIap.finishTransaction(purchase, true);
        await RNIap.finishTransaction(purchase, false);
      } else {
        // Retry / conclude the purchase is fraudulent, etc...
      }
    },
  );
  purchaseErrorSubscription = purchaseErrorListener((error: PurchaseError) => {
    console.log('purchaseErrorListener', error);
  });
};

์ƒํƒœ ๊ตฌ์„ฑ ์š”์†Œ ๋‚ด๋ถ€ :

useEffect(() => {
    loadIAPListeners();
    return () => {
      purchaseUpdateSubscription.remove();
      purchaseErrorSubscription.remove();
    };
  }, []);
์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰