React Native IAP V8.1.1中requestSubscription返回true而非SubscriptionPurchase对象
react-native-iap requestSubscription 返回 true 而非 SubscriptionPurchase 对象的排查与解决
问题背景
使用 react-native V0.65.1 + react-native-iap V8.1.1 版本,调用requestSubscription方法后,日志输出iap data: true,但官方文档明确该方法应返回SubscriptionPurchase对象,导致后续依赖data.productId等字段的逻辑报错。
核心调用代码:
RNIap.requestSubscription({ sku: chosen }).then((data) => { console.log('iap data:', data); user.upgradeUser({ productId: data.productId, purchaseToken: Platform.select({ ios: data.transactionReceipt, android: data.purchaseToken }), }).then(() => { setloading(false); RNIap.finishTransaction(data, false); navigation.navigate('PlusCeleb'); }).catch(() => { setloading(false); }); }).catch((err) => { setloading(false); console.log('iap err', err); Message( err.message, 'warning', ); });
可能原因及解决步骤
1. 版本兼容性冲突
react-native-iap V8.x 版本的API设计与 react-native 0.65.x 存在兼容性差异,部分场景下requestSubscription会返回布尔值而非完整购买对象。
- 方案1:降级 react-native-iap 到 V7.x 系列(该版本与 RN 0.65.x 适配更稳定)
- 方案2:升级 react-native 到 0.66+ 版本,以适配 react-native-iap V8.x 的API规范
2. 初始化流程不完整
调用requestSubscription前,必须确保完成以下初始化步骤:
- 调用
RNIap.initConnection()建立与内购服务的连接 - 调用
RNIap.getSubscriptions([chosen])验证sku的有效性,确认商品已在对应平台配置
3. 平台配置缺失
Android端
- 确认Google Play Console中已创建并发布订阅商品到测试轨道
- 应用包名、签名证书与Google Play Console配置一致
AndroidManifest.xml中已添加<uses-permission android:name="com.android.vending.BILLING" />权限
iOS端
- App Store Connect中已配置订阅项目,测试账号已加入沙盒测试列表
- 确认
SKPaymentQueue的监听逻辑正确,部分场景下购买对象会通过监听事件返回,而非requestSubscription的Promise
临时修复方案
若暂时无法调整版本,可改用购买事件监听的方式获取完整购买对象:
import { useEffect } from 'react'; import { Platform } from 'react-native'; import RNIap from 'react-native-iap'; // 组件内部添加监听 useEffect(() => { // 监听购买更新事件 const purchaseListener = RNIap.purchaseUpdatedListener((purchase) => { if (purchase.productId === chosen) { console.log('完整购买对象:', purchase); // 执行升级逻辑 user.upgradeUser({ productId: purchase.productId, purchaseToken: Platform.select({ ios: purchase.transactionReceipt, android: purchase.purchaseToken }), }).then(() => { setloading(false); RNIap.finishTransaction(purchase, false); navigation.navigate('PlusCeleb'); }).catch(() => { setloading(false); }); } }); // 监听购买错误事件 const errorListener = RNIap.purchaseErrorListener((error) => { setloading(false); console.log('iap err', error); Message(error.message, 'warning'); }); // 组件卸载时移除监听 return () => { purchaseListener.remove(); errorListener.remove(); }; }, [chosen, navigation]); // 发起订阅请求 RNIap.requestSubscription({ sku: chosen }).catch((err) => { setloading(false); console.log('iap err', err); Message(err.message, 'warning'); });
内容的提问来源于stack exchange,提问作者NyF__
相关产品推荐
相关产品推荐

