React-native-iap: 在生产 iOS 版本中未调用 PurchaseUpdateListners

创建于 2020-10-09  ·  25评论  ·  资料来源: dooboolab/react-native-iap

大家好,

我不确定我的代码实际发生了什么。 我将 react-native-iap 插件集成到我的 iOS 应用程序中。 它在本地构建或 testflight 构建上运行良好,但是当我发布应用程序的移动版本并进行订阅时,但接下来什么也没发生。 我假设purchaseUpdateListeners 没有在生产构建上工作,然后我删除了监听器并在requestSubscription 发送响应之后编写代码。 并发布了下一个版本的应用程序,但即使没有调用 getReceiptIOS 仍然存在同样的问题。 我陷入了这个困境。 帮我从中找出答案。

这是我的代码:-

const 购买 = 等待 RNIap.requestSubscription(productId);
console.log(购买,“购买...”)
this.validateTransactionReceipt(purchases);

validateTransactionReceipt 方法:-

validateTransactionReceipt =(购买)=> {
const 收据 = purchase.transactionReceipt;
如果(收据){
AppEventsLogger.logEvent("订阅交易收据已验证", { type: 'owner' });
const 收据正文 = {
“收据数据”:purchase.transactionReceipt,
'密码':subscriptionSecret
};

        RNIap.validateReceiptIos(receiptBody, true).then(receipts => {
            let lastReceipt = receipts.latest_receipt_info[receipts.latest_receipt_info.length - 1];
            console.log(lastReceipt, "lastReceipt...")
            let params = {
                productId: purchase.productId,
                transactionId: purchase.transactionId,
                autoRenew: purchase.hasOwnProperty("originalTransactionDateIOS") ? true : false,
                // autoRenew: true,
                transactionDate: purchase.transactionDate,
                status: "success",
                transactionReceipt: lastReceipt,
                paymentMode: receipts.environment,
                originalTransactionDateIOS: purchase.hasOwnProperty("originalTransactionDateIOS") ? purchase.originalTransactionDateIOS : purchase.transactionDate,
                originalTransactionIdentifierIOS: purchase.hasOwnProperty("originalTransactionIdentifierIOS") ? purchase.originalTransactionIdentifierIOS : purchase.transactionId
            }

            console.log(params, "params-1");
            this.subscriptionSaveHandler(params);
        });
        if (Platform.OS === 'ios') {
            RNIap.finishTransactionIOS(purchase.transactionId).then(response => {
                console.log(response, "finish");
            });
        }
    }
}

谢谢

📱 iOS 🙏 help wanted

所有25条评论

我认为您首先需要首先使用 false 参数调用 validateReceiptIos,然后如果该调用返回 21007,则您使用 true 调用它。 这样它就可以在 prod 和沙箱中工作。 这是我遇到的事情。

即使在调用 RNIap.validateReceiptIos() 时将“isTest”设置为“false”,我也遇到了同样的问题。

在将“isTest”设置为“true”的实际设备上进行测试似乎可以工作,但是当推送到生产环境时则不起作用。
Apple 的测试人员如何批准我的应用程序,但我不确定如何。

当然,当您在生产中验证收据时(使用 false 参数),如果返回状态为 21007,请在沙箱中验证(使用 true 参数)。

然后在调用finishTransactionIOS() 之后,也调用finishTransaction()。

希望有帮助!

@the-dut 太棒了! 打算试试那个配置。

将报告发生的事情:D。

我只是希望 Apple 和 Google 有更可靠的能力让开发人员在经历发布流程之前进行测试,只是为了解决我们的代码不起作用:/。

@the-dut 好的现在我在调用 RNIap.requestSubscription([productId]) 后收到无穷无尽的密码/登录提示

可能是之前提出的所有请求都没有最终确定。 根据您测试的数量,可能是数百或数千。 也许一旦你通过它们,你可能会没事。

另外,您是在真实设备上进行测试吗? 本地或TestFlight? 您使用的是 Sandbox 用户还是生产 ID? 如果是沙盒用户,您是否在手机中设置了该 ID 作为沙盒用户?

我从来没有见过那个问题。 但我可以尝试提供帮助。

另外,您是在真实设备上进行测试吗?
通过 XCode 的真实设备 :: iOS 13.6.1

本地或TestFlight?
当地的

您使用的是 Sandbox 用户还是生产 ID?
沙盒用户 ID

如果是沙盒用户,您是否在手机中设置了该 ID 作为沙盒用户?
他们被设置

这是我的代码

购买更新监听器():


await RNIap.clearTransactionIOS();
            let receipt = purchase.transactionReceipt;

            validatePurchase(receipt).then(async resp => {
                console.log('validated purchase');
                console.log(resp);
                // let iosTransactionFinished = await finishTransactionIOS(purchase.transactionId);
                let transactionFinished = await finishTransaction(purchase, false);
                let result = await successfullySubscribed(purchase);


                if (result.success && !fullFirstLaunchFlow) {
                    goTo('Home');
                }
            });

验证购买():

const receiptBody = {
                    'receipt-data': receipt,
                    'password': '<shared secret>'
                };

                console.log('validating purchase');

                let validReceipt = await RNIap.validateReceiptIos(receiptBody, false);
                console.log('valid receipt');
                console.log(validReceipt);
                if(validReceipt.status === 21007){
                    validReceipt = await RNIap.validateReceiptIos(receiptBody, true);
                    console.log('valid receipt was 21007');
                    console.log(validReceipt);
                }

您是否有理由将 finishTransactionIOS 注释掉? 您应该同时执行finishTransactionIOS() 和finishTransaction()

我可能会感到困惑,但我认为 README 中的此描述仅在使用 v4.1.0 或更高版本时才使用“finishTransaction”。

或者这是否意味着按照您的建议同时使用它们?

我目前使用的是 v4.5.4。

iOS only
Finish a transaction. Use finishTransaction instead for both platforms since version 4.1.0 or later.

好点子! 以防万一,我两个都做。

好吧,无论哪种方式,它都永远不会到达这些行,大声笑。

我将取消注释该行。 我愿意尝试任何事情来让这个工作:D

刚刚升级到 v5.0.0,希望有所改变,但没有骰子。

仍然收到多个密码提示。

我一次得到 2 个,在第二次提示后,它错误地显示“E_UNKNOWN”无法连接到 iTunes。

当您添加更新的purchaselistener时,这一切是否开始发生? 如果是这样,您可能需要先完成所有未完成的交易。 或者.. 使用您的真实 Apple ID 而不是测试用户。

这一切都发生在“requestSubscription()”上。 之后我再也没有看到另一个控制台日志。

我在 requestSubscription 执行后看到的唯一控制台日志是“购买开始!”。

下一个控制台日志是“购买失败!!” 其次是“puchaseErrorListener”中的“E_UNKNOWN”错误。

您是否尝试过使用真实的 Apple ID?

我还没有尝试过。 我需要添加我的真实 Apple ID 作为测试人员吗?

不,我想你可以使用它。

使用我的 Apple ID 它只提示我一次并立即给出“E_UNKOWN”错误。

刚刚尝试使用新创建的沙盒用户进行测试,但没有骰子。

2 pwd 提示和错误。

真正奇怪的是,我知道现在不应该是这样,我以前在验证收据之前使用过“finishTransaction()”并且它是这样工作的。

快速更新。

@the-dut 我提交了一个构建,其中包含您建议的所有设置(对 TestFlight)并且它有效!! 所以现在我不顾一切地将其提交生产。

这真是个好消息! 让我们知道怎么回事!

感谢大家在当前线程中进行讨论和分享好处❤️

抱歉延迟报告。

忘记添加它在生产中有效!!

接下来......接受促销活动,以便我可以将我的应用程序免费提供给朋友和家人 😁

@BStenfors9119到底是什么问题? 您能具体分享一下您是如何解决问题的吗? 非常感谢你。

此页面是否有帮助?
0 / 5 - 0 等级