React-native-iap: RNIap.getProducts๊ฐ€ iOS์—์„œ ์•ฝ์†์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2018๋…„ 12์›” 19์ผ  ยท  24์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: dooboolab/react-native-iap

react-native-iap ๋ฒ„์ „

"react-native-iap": "^ 2.3.25"

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

"๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ": "0.57.4",

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

IOS

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

buyProduct๋Š” promise๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค (.then () is not call),

์‹ค์ œ ํ–‰๋™

buyProduct๊ฐ€ ์•ฝ์†์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ณ , Android์—์„œ๋Š” ์ž˜ ์ž‘๋™ํ•˜๊ณ  .then () ํ˜ธ์ถœ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜์—ˆ์ง€๋งŒ ios์—์„œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

์‹ค์ œ ์žฅ์น˜

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

onBuyNowPress() {
    this.setState({ loading: true });
    RNIap.getProducts(['product_id']).then(success => { 
       RNIap.buyProduct('product_id').then(purchase => { 
        console.log("Purchase >>", purchase)
        this.setState({
          loading: false,
          receipt: purchase.transactionReceipt, 
        });
        Alert.alert('Purchase Successful!');
        this.props.getPurchase();
       }).catch(err => { 
         console.log(err.code, err.message);
          this.setState({ loading: false });
          Alert.alert(err.message);
          if(err.message === "You already own this item.") {
            this.props.getPurchase();
          }
        }) 
      }).catch(error => { 
        alert(error); 
        this.setState({ loading: false });
      })
  }

iOS์—์„œ๋Š” ์ด๋ฏธ ์ œํ’ˆ์„ ๊ตฌ๋งค ํ–ˆ์œผ๋ฏ€๋กœ ์ง€๊ธˆ ๊ตฌ๋งค๋ฅผ ๋ˆ„๋ฅด๋ฉด ์ด๋ฏธ์ด ์ œํ’ˆ์„ ๊ตฌ๋งค ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ํŒ์—…์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ .then () ๋˜๋Š” .catch () ๊ฐ€ ์ „ํ™”๋ฅผ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ getAvailablePurchases () ๋ฉ”์„œ๋“œ๋ฅผ ์‹œ๋„ํ–ˆ์ง€๋งŒ ํ•ญ์ƒ []์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค

๐Ÿ“ฑ iOS ๐Ÿ™ help wanted

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

2.4.0-beta4 ์‹œ๋„ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

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

@LinusU @JJMoon ์ด ๋งž์•˜๋‹ค ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. async ๋ชจ๋‘ ์ œ๊ฑฐํ–ˆ๋Š”๋ฐ ๋ฌธ์ œ๊ฐ€ ๋‹ค์‹œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•ด? @ ZeroCool00 ๋‹น๋ถ„๊ฐ„ 2.3.24 ๋กœ ๋‹ค์šด ๊ทธ๋ ˆ์ด๋“œ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@ ZeroCool00 ์‚ฌ์‹ค 2.3.26 ์‚ฌ์šฉํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@hyochan ์กฐ๋งŒ๊ฐ„ ํ…Œ์ŠคํŠธ ํ• ๊ฒŒ์š” .. ์•Œ๋ ค ๋“œ๋ฆด๊ฒŒ์š”. ๋น ๋ฅธ ๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@hyochan 2.3.26์œผ๋กœ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ์–ด๋–ค ํ•ด๊ฒฐ์ฑ…?

@ ZeroCool00 ๊ทธ๋ ‡๋‹ค๋ฉด ์—ฐ๊ฒฐ ๋ฌธ์ œ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. unlink ์‹œ๋„ํ•˜๊ณ  ๋‹ค์‹œ link ์‹œ๋„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@hyochan ๋‚ด๊ฐ€ ์‹œ๋„ํ–ˆ์ง€๋งŒ ๋งํฌ๋ฅผ ํ•ด์ œํ•˜๊ณ  ์ œ๊ฑฐํ•˜๊ณ  ๋‹ค์‹œ ์„ค์น˜ํ•˜๊ณ  ๋‹ค์‹œ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค

@ ZeroCool00 ์ฐฝ์— ์žˆ๋‹ค๋ฉด ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ ๋งํฌ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋”์šฑ ๋ถˆ์•ˆ์ •ํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜๋™์œผ๋กœ ์‹œ๋„ ํ–ˆ์Šต๋‹ˆ๊นŒ? ๋˜ํ•œ 2.3.24 ๋„ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค. ๊ตฌ์„ฑ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@hyochan im Mac์—์„œ ์—ฐ๊ฒฐ์„ ํ•ด์ œํ•˜๊ณ  2.3.24๋ฅผ ์ œ๊ฑฐํ•œ ๋‹ค์Œ ์„ค์น˜ํ•˜๊ณ  ์ˆ˜๋™ ์„ค์ •์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๊ฐ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  Android์—์„œ ์ž‘๋™ํ•˜๋ฉฐ ios์—์„œ๋Š” ์—ฌ์ „ํžˆ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์‹ ์ € ํŒ์—… ๋ฐ ์ œํ’ˆ ๊ตฌ๋งค๋„ ๋ฐ›๊ณ  ์žˆ์ง€๋งŒ ๋ฐ˜ํ’ˆ ์•ฝ์†์€ ์—†์Šต๋‹ˆ๋‹ค.?

iOS์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ๊ตฌ์„ฑ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์—ฌ๊ธฐ์— ๊ฐ‡ํ˜€์„œ ์ด๋ฏธ ๊ตฌ๋งค ํ•œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@JJMoon @ ZeroCool00 ๋„์™€

@ ZeroCool00 ๋˜ํ•œ Alert ์ œ๊ฑฐํ•˜๊ณ  console ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ€์‹  ํ…Œ์ŠคํŠธํ•˜์‹ญ์‹œ์˜ค. ios ๋Š” ๊ตฌ๋งค๊ฐ€ ์ฒ˜๋ฆฌ ๋  ๋•Œ ์ž๋™์œผ๋กœ ๋„ค์ดํ‹ฐ๋ธŒ Alert ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๊ฐ€ ์ค‘๋‹จ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@hyochan Plz๋Š” ์ด๊ฒƒ์„ ๋‹ค์‹œ ์—ฝ๋‹ˆ ๋‹ค .. ๋‚˜๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์‹œ๋„ํ–ˆ๋‹ค .. ๋‚˜๋Š” ๋˜ํ•œ ๊ฒฝ๊ณ ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค. ์‹ฌ์ง€์–ด ๋‚œ ๋””๋ฒ„๊น…์„ ์ค‘์ง€ํ•˜๊ณ  ํ™•์ธํ•ฉ๋‹ˆ๋‹ค .. ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด ์•ฑ์„ ๊ฒŒ์‹œํ•˜๊ณ  ์‹ถ์—ˆ์ง€๋งŒ ์—ฌ๊ธฐ์— ๊ฐ‡ํ˜€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์‹ฌ์ง€์–ด์ด lib https://github.com/chirag04/react-native-in-app-utils ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด lib๋„ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ๋งค ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ ์•ฝ์†์„ ์–ป์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ์ฝœ๋ฐฑ์„๋ฐ›๋Š” ์ˆ˜๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์„œ๋ฒ„ API๋ฅผ ํ˜ธ์ถœ ํ•  ์ˆ˜์žˆ๋Š” ์ด๋ฒคํŠธ ์ฝœ๋ฐฑ์„ ์›ํ•ฉ๋‹ˆ๋‹ค.

@ ZeroCool00 async ๋ฐ await ๋„ ์‚ฌ์šฉํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๋˜ํ•œ ์šฐ๋ฆฌ ์•ฑ์—์„œ ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์šฐ๋ฆฌ๋Š”์ด ๋ฌธ์ œ์— ์ง๋ฉดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@hyochan ์ด ๋ฐ๋ชจ๋ฅผ ์ œ๊ณตํ•ด ์ฃผ ๊ณ„์‹ญ๋‹ˆ๊นŒ .. ํฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

async forIOS() {
    let purchase =  await RNIap.buyProduct('product_id');
    console.log("BannerPurchase >>",purchase);  **<--- THIS IS NOT GETTING CALL**
    if(purchase) {
      console.log("Purchase >>", purchase)
      this.props.getPurchase();
      this.setState({
        loading: false,
        receipt: purchase.transactionReceipt, 
      });
      console.log('Purchase succesfully')
    }
  }

@hyochan ๋‚˜๋Š” ๋‹น์‹ ์ด ๋งํ•˜๋Š” ๊ฒƒ์„ ๋”ฐ๋ฅด๊ณ ,์ด ๊ณผ์ •์€ ๋ฌดํ•œํ•˜๋ฉฐ ์•„๋ฌด๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์‹ฌ์ง€์–ด ๋กœ๊ทธ๋ฅผ ์–ป์ง€ ๋ชปํ•œ๋‹ค.

์š”์ฆ˜ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์šฐ๋ฆฌ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ท€ํ•˜์˜ ์‚ฌ๋ก€๋Š” ๋งค์šฐ ์ด์ƒํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๋‹น์‹ ์˜ ์™„์ „ํ•œ ์ž‘์—… ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์œผ๋ฉด ์šฐ๋ฆฌ๊ฐ€ ์•Œ์•„๋‚ด๋Š” ๊ฒƒ์ด ์–ด๋ ค์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@hyochan @ ZeroCool00๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
2.3.26์—์„œ 2.4.0-beta3์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ (์—ฐ๊ฒฐ ํ•ด์ œ ๋ฐ ์—ฐ๊ฒฐ๋จ), ๊ฐ™์€ ์ด์•ผ๊ธฐ์ž…๋‹ˆ๋‹ค.
์žฅ์น˜์—์„œ ๋กœ๊ทธ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์‹ค์ œ iPhone์„ ์‚ฌ์šฉํ•˜์—ฌ xCode (์™€์ด์–ด ์—ฐ๊ฒฐ)๋ฅผ ํ†ตํ•œ ๊ฐœ๋ฐœ ๋นŒ๋“œ.

[IAPInfoManager]: Update operation failed, error: Error Domain=SSErrorDomain Code=109 "Cannot connect to iTunes Store" UserInfo={NSLocalizedDescription=Cannot connect to iTunes Store, SSErrorHTTPStatusCodeKey=401}

๊ทธ๋Ÿฌ๋‚˜ ๊ตฌ๋งค ํŒ์—…์ด ์„ฑ๊ณต ์‚ฌ๋ก€์™€ ํ•จ๊ป˜ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Javascript Thread์—์„œ ๋ฐ˜์‘์ด ์—†์Šต๋‹ˆ๋‹ค.
Promise๋Š” iOS ๋ชจ๋“ˆ์—์„œ ํ•ด๊ฒฐ๋˜๊ฑฐ๋‚˜ ๊ฑฐ๋ถ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

try {
      let purchase = false;

      console.log('BEFORE BUY');
      if (Platform.OS === 'ios') {
        purchase = await RNIap.buyProduct(selected);
      } else {
        purchase = await RNIap.buySubscription(selected);
      }
      console.log('AFTER BUY');

      await RNIap.finishTransaction();
      console.info('purchase >', purchase);
      setSubscription({type: selected, purchaseData: purchase});
    } catch (err) {
      console.log(err); // TODO add something went wrong
    }

AFTER BUY
๋‚˜ํƒ€๋‚˜์ง€ ๋งˆ. async / await์—†์ด .then promise๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋™์ผํ•œ ์Šคํ† ๋ฆฌ.

์ด ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜์žˆ๋Š” ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

2.4.0-beta4 ์‹œ๋„ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@hyochan ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ๐Ÿ‘
๋‚ด ํŽธ์—์„œ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@IsaevTimur ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐ ํ–ˆ์Šต๋‹ˆ๊นŒ? ์—ฌ์ „ํžˆ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@hyochan ์—ฌ๊ธฐ ๋‚ด ์ธ์•ฑ ๊ตฌ๋งค ๋ชจ๋“ˆ์˜ ์ „์ฒด ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

import React, { Component } from 'react';
import { View, ImageBackground, TouchableOpacity, Image, Alert, 
  ActivityIndicator, Platform } from 'react-native';
import {inapp, btnBuy, purple} from '../helper/constants';
import ImageResizeMode from 'react-native/Libraries/Image/ImageResizeMode'
import { connect } from 'react-redux';
import { Icon } from 'native-base';
import { Actions } from 'react-native-router-flux';
import * as RNIap from 'react-native-iap';
import { getItems, getPurchase, fetchCategory } from '../action';

const itemSkus = Platform.select({
  ios: [
    'max_asl_unlimited_access'
  ],
  android: [
    'max_asl_unlimited_access'
  ]
});

class Banner extends Component {

  constructor(props){
    super(props);
    this.onBuyNowPress = this.onBuyNowPress.bind(this);
    this.forAndroid = this.forAndroid.bind(this);
    this.forIOS = this.forIOS.bind(this);
  }

  state = {
    loading: false,
  }

  async componentDidMount() {
    try {
      const result = await RNIap.initConnection();
      console.log('result', result);
      this.props.getItems();
    } catch (err) {
      console.warn(err.code, err.message);
    }
}

  componentDidUpdate(prevProps) {
    if(prevProps.purchase !== this.props.purchase) {
      this.props.fetchCategory();
    } 
  }

  onBuyNowPress() {
    this.setState({ loading: true });
    RNIap.getProducts(itemSkus).then(success => { 
      if(Platform.OS == "ios") {
        this.forIOS()
      } else {
        this.forAndroid()
      }
    }).catch(error => { 
      alert(error); 
      this.setState({ loading: false });
    })
  }

  async forIOS() {
    console.log('BannerCall');
    try {
      const purchase = await RNIap.buyProduct('max_asl_unlimited_access');
      console.log("BannerPurchase >>",purchase);
      if(purchase) {
        this.props.getPurchase();
        this.setState({
          loading: false,
        });
        console.log('Purchase succesfully')
      }
    } catch (err) {
      console.log("BannerError >> ", err);
    }
  }

  forAndroid() {
    RNIap.buyProduct('max_asl_unlimited_access').then(purchase => { 
      this.props.getPurchase();
      this.setState({
        loading: false,
        receipt: purchase.transactionReceipt, 
      });
      console.log('Purchase succesfully')
      Alert.alert("Purchase succesfully")
     }).catch(err => { 
       console.log(err.code, err.message);
        this.setState({ loading: false });
        if(err.message === "You already own this item.") {
          this.props.getPurchase();
          Alert.alert("You already own this product, we are restoring your purchase.")
        }
      }) 
  }

  componentWillUnmount() {
    RNIap.endConnection();
  }

  renderSpinner() {
    if(this.state.loading) {
      return (
        <ActivityIndicator size="large" color="#F7CD52" />
      )
    }
    return null
}

  render() {
    const { container, bannerStyle, btnContainer, iconClose } = styles;
    return (
      <View style={container}>
          <ImageBackground source={inapp} style={bannerStyle} resizeMode={ImageResizeMode.contain}>
              <Icon name="close" style={iconClose} type="FontAwesome" onPress={() => {Actions.pop()}}/>
              <View style={btnContainer}>
                {this.renderSpinner()}
                <TouchableOpacity onPress={() => this.onBuyNowPress()}>
                    <Image source={btnBuy}  />
                </TouchableOpacity>
              </View>
          </ImageBackground>
      </View>
    );
  }
}


const styles = {
  container: {
    flex: 1,  
  },
  iconClose: {
    color: '#FFF',
    fontSize: 30,
    alignSelf: 'flex-end',
    margin: 20,
    fontWeight: 'bold',
  },
  bannerStyle: {
    flex: 1,
    width: '100%',
    height: '100%',
    backgroundColor: purple
  }, 
  btnBuy: {
    marginRight: 20,
    marginTop: 160,
    height: 85,
    width: 215,
  },
  btnContainer: {
    flex: 1,
    marginTop: 50,
    justifyContent: 'center',
    alignItems: 'center'
  }
};

function mapStateToProps({ purchase }) {
    return { purchase };
}

export default connect(mapStateToProps, { getItems, getPurchase, fetchCategory })(Banner);

๋ฟก ๋นต๋€จ

2.4.0-beta4๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

๋˜ํ•œ SANDBOX ์‚ฌ์šฉ์ž (๊ฐœ๋ฐœ ์ค‘)๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. iTunes ์—ฐ๊ฒฐ์—์„œ ๊ตฌ์„ฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ์ž๋Š” ์—ฌ๊ธฐ์— ์ƒ์„ฑ https://appstoreconnect.apple.com/access/users ์ƒŒ๋“œ ๋ฐ•์Šค ์„น์…˜์—์„œ.

๋„์›€์ด๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค :)

์•ˆ๋…•ํ•˜์„ธ์š”.
ํ•˜์ง€๋งŒ ๋‚ด ์•ฑ ์Šคํ† ์–ด ๊ตฌ๋งค ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž˜ ์ž‘๋™ํ•˜์—ฌ ๋ชจ๋“  ๊ฒƒ์ด ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Œ์„ ์˜๋ฏธํ•˜๋ฉฐ ์˜ˆ 2.4.0-beta4๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ package.json ํŒŒ์ผ์— ๋Œ€ํ•œ ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค.

"react-native-iap": "^2.4.0-beta4",

๋งˆ์นจ๋‚ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ @hyochan .. ์ œ I ์‹œํ—˜ I์ด ๊ด‘๊ณ  ๋ฌผํ’ˆ didntํ•˜๋Š” ๊ฒฝ์šฐ ๋ฌธ์ œ๋Š” await RNIap.finishTransaction(); ๊ทธ ๋•Œ๋Š” () ๋ฉ”์†Œ๋“œ์—์žˆ๋‹ค. ๋‚˜์ค‘์— ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐ์ฑ…์€ ํŠธ๋žœ์žญ์…˜ ( await RNIap.clearTransaction(); )์„ ์ •๋ฆฌํ•ด์•ผํ•˜๋Š”๋ฐ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ด ํ›Œ๋ฅญํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ์ง€์›์— ๋‹ค์‹œ ํ•œ ๋ฒˆ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

@ ZeroCool00 ์„ฑ๊ณต ์ถ•ํ•˜ํ•ฉ๋‹ˆ๋‹ค !! ๋„ค, ๊ทธ๋Ÿฐ ์ข…๋ฅ˜์˜ ๋ฌธ์ œ๋Š” ๋‹น์‹ ์ด ์ž˜๋ชปํ•œ ๊ฒƒ์— ๋Œ€ํ•œ ๊ฒฌ์ธ๋ ฅ์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์‹  ํŽธ์—์„œ ๋” ์ž˜ ํ•ด๊ฒฐ๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ ์ผ๋กœ ๊ณ ํ†ต๋ฐ›์„ ์ˆ˜์žˆ๋Š” ๋ถ„๋“ค์„ ์œ„ํ•ด ๋‹ค์‹œ ์˜ค์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰