ios - React Native : RNIap. getPurchaseHistory().then 无限运行

标签 ios react-native in-app-purchase

项目在此Github Repository .带有代码的文件位于 components/Soundboard.js
这段代码以前可以运行,但现在看来,promise 一直在运行。看起来解析函数和拒绝函数都没有执行,因为如果我取消注释下面的所有注释行并调用函数 askForPurchase()打印到控制台的唯一内容是

  • 一个看起来像 "_40": 0, "_55": {"_40": 0, "_55": null, "_65": 0, "_72": null}, "_65": 3, "_72": null} 的对象对于线路 console.log(RNIap.getPurchaseHistory())
  • 然后是 end 这个词.
  • buyProduct()函数也不再初始化 IAP。
    const buyProduct = function(){
        RNIap.requestPurchase("1985162691", false).then(purchase => {
            store.dispatch(setPurchases(purchase))
            await RNIap.finishTransaction(purchase, false)    //developerPayloadAndroid?: string   Should I use this argument? I don't get how to use it
        }).catch((error) => {
            console.log(error.message);
        })
    }
    
    const askForPurchase = function(){
        if (!store.getState().purchase){
            //console.log(RNIap.getPurchaseHistory())
            RNIap.getPurchaseHistory().then(purchase => {
                //console.log(`test1`)
                store.dispatch(setPurchases(purchase))
                if (purchase.length == 0){
                    //console.log(`test if`)
                    buyProduct()
                }else{
                    //console.log(`test else`)
                    RNIap.getAvailablePurchases()
                }
            }, reason => {
                console.log(reason)
            })
            //console.log(`end`)
        }
    }
    

    额外
    这段代码几个月前还在工作,我什至从那时起提交了一个提交(1b9cb81f229680e173ce910892dddedc632c1651,评论:“让印章图片更卡通化”)来测试。拉出此提交后,我删除了我的 node_modules 和 pod,并清理了我的构建文件夹,但是 askForPurchase()buyProduct()功能也不再在该提交中起作用。
    我正在运行 ios 13.6.1 的真实 iPhone SE 上进行测试

    如果您需要测试它,我创建了一个沙盒测试器,但我认为您不需要它
    email: rniapsandbox@gmail.com
    pw: Somepassword1
    

    最佳答案

    你好@Sam 问题是异步等待问题,他们无法获得值(value),因为他们在获取数据之前没有等待获取数据,它在没有数据的情况下触发它并且它​​正在返回 promise ,所以你必须使用 async function
    所以你的代码就像

    const buyProduct = async()=>{
       await RNIap.requestPurchase("1985162691", false).then(purchase => {
        store.dispatch(setPurchases(purchase))
        await RNIap.finishTransaction(purchase, false)    //developerPayloadAndroid?: string   Should I use this argument? I don't get how to use it
    }).catch((error) => {
        console.log(error.message);
    })}
    
    const askForPurchase = async()=>{
    if (!store.getState().purchase){
        //console.log(await RNIap.getPurchaseHistory())
       await RNIap.getPurchaseHistory().then(purchase => {
            //console.log(`test1`)
            store.dispatch(setPurchases(purchase))
            if (purchase.length == 0){
                //console.log(`test if`)
                buyProduct()
            }else{
                //console.log(`test else`)
                RNIap.getAvailablePurchases()
            }
        }, reason => {
            console.log(reason)
        })
        //console.log(`end`)
    }}
    

    关于ios - React Native : RNIap. getPurchaseHistory().then 无限运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63478519/

    相关文章:

    android - 使用 REST Api 的移动应用程序开发计划是个好主意吗?

    ios - 在 UITextField 中键入时,将给定字符串的每个字符替换为键入的字符

    iphone - 如何多次购买耗材?

    android - 在 App Billing Library 中不提供消费 Purchase Item 后更新的 PurchaseList?

    ios - Paymentquue UpdatedTransactions:未调用,而是paymentQueueRestoreCompletedTransactionsFinished:正在调用

    ios - objective-C:为什么我的循环没有终止?

    ios - Objective-C - [super dealloc] 旧?

    javascript - 对 child 隐藏 createBottomTabNavigator

    javascript - react-native AES加密匹配Java解密算法

    javascript - react native : Flat List not showing up