You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 14:06:54