应用内购完成后无法添加游戏货币Emblems问题求助
问题排查与修复建议
核心问题定位
支付流程已确认正常(款项到账、console.log("purchase successful")可正常输出),但AsyncStorage更新游戏货币(Emblems)的逻辑未生效,而单独测试的AsyncStorage读写逻辑可以正常运行。
排查步骤
给
AsyncStorage添加错误捕获
当前代码里的AsyncStorage.getItem没有错误处理,读写过程中可能出现异常但未被发现。给异步操作加上catch块,查看控制台是否有错误输出:AsyncStorage.getItem('emblems') .then(value => { if (value == null){ AsyncStorage.setItem('emblems', '1'); } else { AsyncStorage.setItem('emblems', (Number(value) + 1).toString()); } }) .catch(err => console.error('AsyncStorage操作失败:', err))验证entitlement判断逻辑是否正确
虽然支付成功,但 entitlement 的判断条件可能不成立,导致后续存储逻辑未执行:- 打印
customerInfo.entitlements.active的完整内容,确认目标 entitlement 确实存在:console.log('当前激活的entitlements:', customerInfo.entitlements.active); - 核对
my_entitlement_identifier是否与后台配置的 entitlement 标识符完全一致。
- 打印
对比测试按钮与支付逻辑的执行环境
在支付成功后先打印当前emblems的值,和测试按钮的打印结果对比,确认是否存在存储上下文差异:console.log('支付前的emblems值:', await AsyncStorage.getItem('emblems'));
修复建议:统一用async/await简化异步逻辑
当前代码混合了await(支付部分)和then(存储部分),容易出现逻辑混乱。改用统一的async/await写法,同时完善错误处理和日志:
<BuyBox Price='$0.99' EN='1 Emblem' onPress={async () => { try { if (this.state.offerings == null) return; const pkg = this.state.offerings.emblems.availablePackages.find( offering => offering.identifier === 'ispy_1_emblems' ); if (!pkg) return; const {customerInfo} = await Purchases.purchasePackage(pkg); if (customerInfo.entitlements.active.my_entitlement_identifier) { console.log("purchase successful"); const currentEmblems = await AsyncStorage.getItem('emblems'); const newEmblems = currentEmblems ? (Number(currentEmblems) + 1).toString() : '1'; await AsyncStorage.setItem('emblems', newEmblems); console.log('更新后的emblems值:', newEmblems); } else { console.log('未检测到激活的entitlement'); } } catch (err) { console.error('购买或存储过程出错:', err); } }} />
需要补充的排查信息
若以上步骤未解决问题,请提供:
- 控制台的完整日志输出(含支付成功日志、entitlements打印信息、AsyncStorage错误日志)
- 测试按钮的完整代码,对比两者执行环境差异
Purchases库(推测为RevenueCat)的版本、React Native版本- 测试设备的系统版本(iOS/Android)
内容的提问来源于stack exchange,提问作者Theo Lupescu
相关产品推荐
相关产品推荐

