React Native IAP getAvailablePurchases()在iOS正式版返回空数组问题
解决react-native-iap正式版getAvailablePurchases()返回空数组的问题
可能的原因及对应解决方案
1. 本地缓存交易记录不可靠
getAvailablePurchases()仅返回设备本地缓存的未完成或未调用finishTransaction的已完成交易。正式环境中,苹果会自动清理已完成交易的本地缓存,导致该方法返回空数组。
解决方案:
改用refreshReceipt()获取最新收据,结合getReceiptIOS()直接提取应用收据,而非依赖本地交易缓存:
import * as RNIap from 'react-native-iap'; const init = await RNIap.initConnection(); if (init) { try { // 刷新收据确保获取最新状态 await RNIap.refreshReceipt(); let receipt = null; // 先尝试从本地交易中获取收据 const purchases = await RNIap.getAvailablePurchases(); if (purchases.length > 0) { const sorted = purchases.sort((a, b) => b.transactionDate - a.transactionDate); receipt = sorted[0].transactionReceipt; } else { // 本地无缓存,直接提取应用收据 receipt = await RNIap.getReceiptIOS(); } if (receipt) { await API({ method: 'POST', url: '/subscription/check-receipt', data: { latestAvailableReceipt: receipt }, }); } } catch (err) { console.error('订阅检查失败:', err); } finally { await RNIap.endConnection(); } }
2. 未正确调用finishTransaction清理缓存
沙盒环境中,未调用finishTransaction会让交易一直留在本地缓存;但正式环境中苹果会自动清理这些记录,导致后续getAvailablePurchases返回空。
解决方案:
每次处理完购买/恢复交易后,务必调用finishTransaction:
const handlePurchase = async (purchase) => { try { // 提交收据到后端验证 await API({ method: 'POST', url: '/subscription/check-receipt', data: { latestAvailableReceipt: purchase.transactionReceipt }, }); // 完成交易,清理本地缓存 await RNIap.finishTransaction(purchase, false); } catch (err) { console.error('交易处理失败:', err); } };
3. App Store Connect配置问题
- 确认订阅项目已正式发布(沙盒测试无需发布,但正式版必须通过审核并上线)。
- 检查应用捆绑ID与App Store Connect配置完全一致。
- 确认用户Apple ID所在区域与订阅项目的可用区域匹配。
4. 后端收据验证端点错误
正式版必须使用苹果正式环境的验证端点,若误用沙盒端点会导致验证失败,误以为用户未订阅:
- 正式环境:
https://buy.itunes.apple.com/verifyReceipt - 沙盒环境:
https://sandbox.itunes.apple.com/verifyReceipt
内容的提问来源于stack exchange,提问作者Yaroslav Pesotskii
相关产品推荐
相关产品推荐

