react-native-purchases与RevenueCat内购功能异常求助
排查react-native-purchases(RevenueCat)安卓内购无响应及AsyncStorage不生效问题
一、核心排查步骤:购买按钮无响应
1. 确认RevenueCat初始化正确性
确保App启动时就完成初始化,且使用安卓专属API密钥(不要混用iOS密钥):
import Purchases from 'react-native-purchases'; import { useEffect } from 'react'; // 在App根组件或启动页执行 useEffect(() => { Purchases.configure({ apiKey: '你的安卓RevenueCat API密钥', appUserID: null // 让RevenueCat自动生成用户ID }); }, []);
2. 检查商品获取与按钮绑定逻辑
- 先在PremiumScreen中预加载商品,确保按钮绑定的是有效商品:
import { useState, useEffect } from 'react'; import { Alert, TouchableOpacity, Text } from 'react-native'; import Purchases from 'react-native-purchases'; const PremiumScreen = () => { const [products, setProducts] = useState([]); useEffect(() => { const fetchProducts = async () => { try { const offerings = await Purchases.getOfferings(); if (offerings.current?.availablePackages) { setProducts(offerings.current.availablePackages); } else { Alert.alert('提示', '未获取到可购买商品'); } } catch (e) { Alert.alert('获取商品失败', e.message); } }; fetchProducts(); }, []); const handlePurchase = async (productPackage) => { try { const { purchaserInfo } = await Purchases.purchasePackage(productPackage); // 购买成功后处理逻辑 handlePurchaseSuccess(purchaserInfo, productPackage); } catch (e) { Alert.alert('购买失败', e.message); } }; return ( // 仅当商品加载完成后才启用按钮 products.map((pkg) => ( <TouchableOpacity key={pkg.identifier} disabled={products.length === 0} onPress={() => handlePurchase(pkg)} > <Text>购买{pkg.product.title}</Text> </TouchableOpacity> )) ); };
- 按钮添加
disabled属性,避免在商品未加载时触发无效点击。
3. 核对商品配置一致性
- 确保Play Console内的一次性商品ID,与RevenueCat后台配置的商品ID完全一致(大小写、符号无差异)
- 确认Play Console商品已发布到内部测试轨道,测试账号已加入测试列表并接受邀请
- 在RevenueCat后台手动触发商品同步,确保平台商品数据同步完成
4. 解决无法调试的问题(替代console.log)
因为无法直接查看日志,用以下两种方式获取关键信息:
- 用
Alert.alert弹出错误或状态信息(如上述代码所示) - 将日志写入AsyncStorage,后续在专属页面读取:
const logDebugInfo = async (message) => { const existingLogs = await AsyncStorage.getItem('purchaseLogs'); const newLogs = `${existingLogs || ''}\n${new Date().toLocaleString()}: ${message}`; await AsyncStorage.setItem('purchaseLogs', newLogs); }; // 使用示例:logDebugInfo('商品加载成功:' + JSON.stringify(products));
二、AsyncStorage数量不生效的修复
1. 正确判断购买成功状态
一次性购买的记录存在purchaserInfo.nonSubscriptions中,不要用entitlement判断(entitlement多用于订阅):
const handlePurchaseSuccess = async (purchaserInfo, productPackage) => { const purchasedSkus = Object.keys(purchaserInfo.nonSubscriptions); const targetSku = '你的商品ID'; if (purchasedSkus.includes(targetSku)) { // 避免重复增加数量,先检查是否已处理过该商品 const processedPurchases = await AsyncStorage.getItem('processedPurchases'); const processedList = processedPurchases ? JSON.parse(processedPurchases) : []; if (!processedList.includes(targetSku)) { // 读取当前徽章数量并更新 const currentEmblems = await AsyncStorage.getItem('userEmblems'); const newCount = parseInt(currentEmblems || '0') + 10; // 替换为你的商品对应数量 await AsyncStorage.setItem('userEmblems', newCount.toString()); // 标记该商品已处理 processedList.push(targetSku); await AsyncStorage.setItem('processedPurchases', JSON.stringify(processedList)); Alert.alert('成功', '徽章已到账'); } else { Alert.alert('提示', '该商品已购买过'); } } };
2. 验证AsyncStorage读写逻辑
确保读写操作使用async/await,避免异步操作未完成导致数据丢失。
三、其他可能的问题点
- 测试设备需登录Play Console测试账号,且未登录其他无关Google账号
- 检查EAS构建的安卓项目中,
build.gradle已正确引入react-native-purchases依赖,版本与官方文档一致 - 确认安卓Manifest中已添加
INTERNET权限(RevenueCat需要网络请求)
内容的提问来源于stack exchange,提问作者Theo Lupescu
相关产品推荐
相关产品推荐

