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

react-native-iap获取商品异常:getProducts空数组、getSubscriptions未定义

iOS模拟器下React Native IAP商品获取异常解决指南

核心原因:协议未签署

你怀疑的协议问题是关键——只要应用包含内购商品,必须签署App Store Connect的「付费应用协议」,仅签署免费协议会导致苹果服务器拒绝返回内购商品数据,这是此类问题最常见的诱因。

分步排查修复

1. 补全付费应用协议

  • 登录App Store Connect,进入「协议、税务和银行业务」板块
  • 找到「付费应用协议」,完成所有必填信息(银行账户、税务资料等)并提交审核,通常1-2个工作日生效
  • 注意:哪怕应用本身免费,只要有内购项,此协议是硬性要求

2. 优先使用真机测试

iOS模拟器对内购的支持存在局限性,建议切换到真机测试:

  • 真机登录Sandbox测试账号(设置→App Store→退出正式账号,登录提前创建的沙盒测试员账号)
  • 真机环境下react-native-iap的API调用更稳定,能准确返回配置的商品数据

3. 代码逻辑校验

useIAP Hook正确用法

确保初始化和调用时机正确:

import { useIAP } from 'react-native-iap';
import { useEffect } from 'react';

const { products, subscriptions, getProducts, getSubscriptions } = useIAP();

useEffect(() => {
  const fetchItems = async () => {
    try {
      // 替换为你的实际SKU
      await getProducts({ skus: ['com.yourapp.product1'] });
      await getSubscriptions({ skus: ['com.yourapp.subscription1'] });
    } catch (err) {
      console.error('获取商品失败:', err);
    }
  };
  fetchItems();
}, [getProducts, getSubscriptions]);

直接调用API的错误处理

如果不用Hook直接调用API,需做好错误捕获:

import { getProducts, getSubscriptions } from 'react-native-iap';

const fetchIAPData = async () => {
  try {
    const products = await getProducts({ skus: ['你的商品SKU'] });
    const subscriptions = await getSubscriptions({ skus: ['你的订阅SKU'] });
    console.log('商品列表:', products, '订阅列表:', subscriptions);
  } catch (error) {
    // 错误信息会暴露苹果的拒绝原因,比如协议问题、SKU无效等
    console.error('IAP调用错误:', error);
  }
};

4. 配置项二次检查

  • 确认App Store Connect内购商品状态为「准备提交」或「已批准」,草稿状态的商品无法被获取
  • Xcode的Capabilities中「In-App Purchase」已启用,Bundle ID与App Store Connect完全匹配
  • 沙盒测试员账号已添加到App Store Connect的「用户和访问」→「沙盒测试员」列表

误区澄清

  • 应用未发布、未上传安装包不影响内购测试,只要协议签署完成、商品配置正确,Sandbox环境就能正常返回数据
  • 模拟器缓存可能导致异常,可尝试重启模拟器、重置模拟器内容或卸载重装应用

内容的提问来源于stack exchange,提问作者Zero0

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 16:25:02