React Native Android In App Purchase 错误

Posted

技术标签:

【中文标题】React Native Android In App Purchase 错误【英文标题】:React Native Android In App Purchase Error 【发布时间】:2019-07-22 05:02:18 【问题描述】:

react-native-iap 的版本

^2.4.1

react-native 的版本

16.6.3

您遇到错误的平台(iosandroid 或两者?)

安卓

预期行为

列出物品或购买物品

实际行为

产品数组为空

测试环境(模拟器?真机?)

真实设备

重现行为的步骤

我有两个错误: E_UNKNOWN 发生未知或意外错误。请稍后再试。 添加购买监听器仅在 ios 中提供。 这是我的物品 ID:ozann_ozan

一些代码:

<TouchableOpacity 
                onPress=() => this.buyItem('ozann_ozan')
                > 
const itemSkus = Platform.select(
    ios: [
      'com.example.coins100'
    ],
    android: [
      'com.bettipspro'
    ]
  );
      componentWillMount() 
        this.getAvailablePurchases();
        this.getItems();
      
async componentDidMount() 
      try 
        const products = await RNIap.getProducts(itemSkus);
        console.log(products);
        this.setState( products );
       catch(err) 
        console.warn(err); // standardized err.code and err.message available
      
    
    getItems = async() => 
      const products = await RNIap.getProducts(itemSkus);
      console.log(itemSkus);
      try 
        const products = await RNIap.getProducts(itemSkus);
        // const products = await RNIap.getSubscriptions(itemSkus);
        console.log('Products', products);
        this.setState( productList: products );
       catch (err) 
        console.warn(err.code, err.message);
      
    
    getAvailablePurchases = async() => 
        console.log('eben');
      try 
        console.info('Get available purchases (non-consumable or unconsumed consumable)');
        const purchases = await RNIap.getAvailablePurchases();
        console.info('Available purchases :: ', purchases);
        Alert.alert(purchases.length);
        if (purchases && purchases.length > 0) 
            Alert.alert('purchases.length');
          this.setState(
            availableItemsMessage: `Got $purchases.length items.`,
            receipt: purchases[0].transactionReceipt,
          );
        
       catch (err) 
        console.warn(err.code, err.message);
        Alert.alert(err.message);
      
    
    buyItem = async(sku) => 
      console.info('buyItem: ' + sku);
      try 
        const purchase: any = await RNIap.buyProduct(sku);
        this.setState( receipt: purchase.transactionReceipt , () => this.goToNext());
       catch (err) 
        console.warn(err.code, err.message);
        const subscription = RNIap.addAdditionalSuccessPurchaseListenerIOS(async(purchase) => 
          this.setState( receipt: purchase.transactionReceipt , () => this.goToNext());
          subscription.remove();
        );
      
    

【问题讨论】:

【参考方案1】:

我也遇到了同样的问题,尽管这有点老了,但我认为为有问题的人提供一些支持会很有用。因为我自己刚刚遇到这个问题,这很烦人,因为文档并没有真正清楚地提到这一点。

仅在 Android 上 - 您需要打开与计费服务的连接。这曾经是RNIAP.prepare(),但现在是RNIAP.initConnection()。这在 iOS 上没有任何作用,但这是 RNIAP.getProducts(itemSkus) 工作的必要步骤。

此外,如果您尝试接收 订阅,由于某种原因,它在 iOS 上是不可知的,如果您调用 RNIAP.getProducts(itemSkus),您会得到它们,但在 Android 上,您需要将它们指定为它的订阅去工作。您可以使用RNIAP.getSubscriptions(itemSkus) 来执行此操作。

为了解决不同的问题,我在 Android 和 iOS 上为此奋斗了几个小时,所以我希望这会有所帮助。

干杯

【讨论】:

是的,非常感谢您,因为您分享了您的知识。我最近想通了这个问题。在我解决这个问题之前,我为 android 设备使用了不同的库。再次感谢您,这真的很痛苦,由于您的有用回答,人们可以解决问题。 RNIAP.initConnection() 应该返回什么?调用此方法时,我得到一个空数组。 RNIAP.initConnection() 应该给你真或假。这是文档的形式:在 Android 上,可以调用它来预加载与 Play 服务的连接。在 iOS 上,它会简单地调用 canMakePayments 方法并返回侦听器正常工作所需的值。

以上是关于React Native Android In App Purchase 错误的主要内容,如果未能解决你的问题,请参考以下文章

windows上react-native run-android时Exception in thread "main" java.lang.IllegalArgumentExcep

react-native android fetch json停止工作

Create a Draggable Opacity Changing Circle with Reanimated in React Native

React Native Android入门实战及深入源码分析系列——React Native源码编译

命令失败:gradlew.bat app:installRelease -PreactNativeDevServerPort=8081 in react-native

react-native 跳转到ios/android 权限设置界面