iOS15沙箱环境react-native-iap内购失效 requestSubscription返回空数组
问题排查及解决方案
1 版本兼容性问题
你当前使用的react-native-iap@7.0.5存在iOS 15系统的已知适配缺陷:该版本对iOS 15引入的StoreKit 2框架兼容不完整,沙箱环境下会出现订阅商品查询返回空、StoreKit会话意外中断的问题,这是导致你当前现象的核心常见原因。
2 代码逻辑错误
你提供的实现代码存在两处会直接触发StoreKit异常的逻辑问题:
clearTransactionIOS()方法调用位置错误:该方法用于清理未完成的历史交易,你将其放在订阅请求发起前执行,会直接中断当前已经建立的StoreKit连接,导致后续的订阅请求失败、甚至损坏整个App的StoreKit会话。- 未做异常分支判断:你没有校验
initConnection()、getSubscriptions()的返回结果是否合法,若初始化失败、商品查询返回空的情况下直接调用requestSubscription(),必然会返回无效结果。
3 iOS配置校验项
请逐一确认以下配置是否正确:
- App Store Connect中配置的订阅商品ID,和
ENV.ENV.subsItems中填写的完全一致,无拼写、大小写、前后空格等差异,且商品状态为「准备提交」 - 测试设备的「设置-App Store」中登录的是有效的沙箱测试账号,未使用正式Apple ID登录沙箱环境
- Xcode项目中已开启「In-App Purchase」能力,App的bundle ID和App Store Connect中配置的完全匹配
修复建议
版本升级
优先将react-native-iap升级到7.5.1以上的7.x稳定版本,若你的RN 0.63.4兼容,可升级到8.x的兼容版本,修复iOS 15的适配问题。
代码逻辑调整
修正后的参考代码如下:
try { const isConnected = await RNIap.initConnection(); if (!isConnected) { console.log('StoreKit连接初始化失败'); return; } const subscriptions = await RNIap.getSubscriptions(ENV.ENV.subsItems); console.log('查询到的订阅商品:', subscriptions); if (subscriptions.length === 0) { console.log('未查询到有效订阅商品,请检查sku配置'); return; } // 仅在交易完成/失败后需要清理历史交易时调用clearTransactionIOS // if (Platform.OS === 'ios') { // await RNIap.clearTransactionIOS(); // } const purchaseResult = await RNIap.requestSubscription(sku, false); console.log('订阅请求结果:', purchaseResult); } catch (err) { console.log('内购流程异常:', err.code, err.message); }
测试流程调整
修复后先卸载设备上的原有App,重启设备后重新安装测试,避免之前损坏的StoreKit会话影响测试结果。
内容的提问来源于stack exchange,提问作者Rajesh Koshti
相关产品推荐
相关产品推荐

