大家好,
我不确定我的代码实际发生了什么。 我将 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");
});
}
}
}
谢谢
我认为您首先需要首先使用 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到底是什么问题? 您能具体分享一下您是如何解决问题的吗? 非常感谢你。