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

Expo内购沙箱弹窗反复弹出,测试购买无法完成求助

解决方案

1. 改用真实iOS设备测试,规避iOS17模拟器沙箱bug

iOS17模拟器的StoreKit沙箱存在已知的弹窗循环、回调不触发问题,属于系统层面bug,暂时无完美修复方案。直接用搭载iOS17的真实设备进行沙箱测试,大概率能解决弹窗反复弹出、代码无回调的问题。

2. 核对RevenueCat与App Store配置

  • 确认Purchases.configure已正确传入你的RevenueCat API密钥,Expo debug模式默认启用沙箱,若手动设置useSandbox参数需确保值为true。
  • 检查RevenueCat后台的产品ID与App Store Connect中创建的订阅产品ID完全一致(注意大小写、特殊字符),且App Store中的产品状态为「准备提交」或「已批准」。

3. 完善代码的错误捕获与状态监听

当前代码的try/catch可能无法捕获iOS17模拟器下的异常,修改代码增加更严谨的错误处理,同时主动监听购买状态更新:

const subscribe = async(item) => {
  try {
    console.log('触发购买流程'); // 先确认函数已执行
    const {purchaserInfo} = await Purchases.purchasePackage(item);
    console.log('purchase info: ', purchaserInfo);
    const purchase = await Purchases.getCustomerInfo();
    console.log('purchase: ', purchase);
    if (purchase.entitlements.active['pro']) {
      await navigation.navigate('Account');
    }
  } catch (error) {
    // 打印完整错误信息,便于排查
    console.error('购买错误详情:', JSON.stringify(error, null, 2));
    if (!error.userCancelled) {
      alert('购买失败,请重试');
    }
  }
};

// 额外监听用户信息更新,避免遗漏回调
useEffect(() => {
  const updateListener = Purchases.addCustomerInfoUpdatedListener((info) => {
    console.log('用户订阅状态更新:', info);
    if (info.entitlements.active['pro']) {
      navigation.navigate('Account');
    }
  });
  return () => updateListener.remove();
}, [navigation]);

4. 重置沙箱测试用户状态

  • 进入模拟器「设置」→「App Store」→「Sandbox Account」,确保登录有效的沙箱测试用户,且该用户未在其他设备登录(沙箱用户存在并发限制)。
  • 若之前用该用户测试过订阅,先注销再重新登录,避免订阅状态缓存导致流程异常。

5. 用Xcode StoreKit测试工具替代模拟器沙箱

若必须使用模拟器,可借助Xcode的StoreKit Test功能:

  1. 打开Xcode创建StoreKit测试配置文件,添加你的订阅产品。
  2. 在模拟器运行App后,通过Xcode的StoreKit测试窗口模拟购买流程,绕过系统沙箱的弹窗bug,同时查看详细购买日志。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 13:42:24