React-native-iap: لا تقدم RNIap.getProducts الوعد على نظام iOS

تم إنشاؤها على ١٩ ديسمبر ٢٠١٨  ·  24تعليقات  ·  مصدر: dooboolab/react-native-iap

نسخة من رد فعل - أصلية - IAP

"رد فعل - أصلي - iap": "^ 2.3.25"

نسخة من رد الفعل الأصلي

"تفاعل أصلي": "0.57.4"،

المنصات التي واجهت الخطأ فيها (IOS أو Android أو كليهما؟)

IOS

سلوك متوقع

يجب أن يعيد buyProduct الوعد (.then () ليس استدعاء) ،

السلوك الفعلي

buyProduct لا يعيد أي وعد ، في android يعمل بشكل جيد ، ثم () اتصل بنجاح ، ولكن في 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 أشتري المنتج بالفعل ، لذا عندما أضغط على شراء الآن ، تظهر لي نافذة منبثقة وكأنك اشتريت هذا المنتج بالفعل. ولكن بعد ذلك () أو. التقاط () لا تحصل على مكالمة.

لقد جربت أيضًا طريقة 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 مرة أخرى.

لقد جربت قمت بإلغاء الربط وإلغاء التثبيت ثم التثبيت مرة أخرى ، ثم الارتباط مرة أخرى. لكنها ما زالت لا تعمل

@ ZeroCool00 إذا كنت في نافذة ، فإن نصوص الارتباط الأصلي 2.3.24 أيضًا. أعتقد أنك تواجه بعض مشاكل التكوين.

hyochan im على نظام التشغيل Mac ،

هل هناك أي تكوين آخر لنظام iOS؟ أنا عالق هنا ، هل هناك أي طريقة أخرى للحصول على ما أشتريه بالفعل.

JJMoon هل يمكنك مساعدة @ ZeroCool00 ؟

@ ZeroCool00 حاول أيضًا إزالة Alert واستخدم console للاختبار بدلاً من ذلك. نظرًا لأن ios يُنشئ تلقائيًا Alert أصليًا عند معالجة عملية الشراء ، مما قد يقطع شفرتك.

hyochan الرجاء إعادة فتح هذا .. لقد حاولت كل شيء .. أنا أيضًا أزل التنبيه. حتى أتوقف عن التصحيح والتحقق .. إنه لا يعمل. كنت أرغب في نشر تطبيقي ، لكنني عالق هنا. حتى أنني جربت هذا lib https://github.com/chirag04/react-native-in-app-utils

هذا lib أيضا لديه نفس المشكلة .. عملية الشراء تسير بشكل جيد ولكن دون أي وعد.

هل هناك أي طريقة دورة حياة أحصل فيها على رد اتصال للحدث. أريد فقط رد اتصال الحدث حيث يمكنني الاتصال بواجهة برمجة تطبيقات الخادم.

@ 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 عليه :(
الوعد لم يتم حله أو رفضه في وحدة 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
لا تحضر حتى. نفس القصة بدون متزامن / انتظار ، مع حل الوعد بـ .then .

أي أفكار قد تسبب هذه المشكلة؟

هل يمكنك تجربة 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 connect. تم إنشاء هؤلاء المستخدمين هنا - https://appstoreconnect.apple.com/access/users ، ضمن قسم Sandbox.

أتمنى أن يساعد :)

تضمين التغريدة
لكن عملية شراء متجر التطبيقات الخاص بي تعمل بشكل جيد مما يعني أن كل شيء مهيأ ، ونعم باستخدام الإصدار 2.4.0-beta4.

ها هو دخولي في ملف package.json

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

hyochan لقد قمت بحل المشكلة أخيرًا .. المشكلة هي عندما اختبرت لأول مرة لم أكتب هذا السطر await RNIap.finishTransaction(); في طريقة (). أضفته بعد ذلك. كانت هذه هي المشكلة ، والحل هو أنني بحاجة إلى مسح المعاملة ( await RNIap.clearTransaction(); ) ، وهو يعمل.

شكرا مرة أخرى لدعمكم ن لهذه المكتبة العظيمة.

@ ZeroCool00 مبروك النجاح !! نعم ، يجب حل هذه الأنواع من المشاكل بشكل أفضل من جانبك لأننا بحاجة إلى بعض الاستحواذ على الخطأ الذي ارتكبته. شكرا لعودتك مرة أخرى لأولئك الذين قد يعانون من نفس الشيء.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات