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功能:
- 打开Xcode创建StoreKit测试配置文件,添加你的订阅产品。
- 在模拟器运行App后,通过Xcode的StoreKit测试窗口模拟购买流程,绕过系统沙箱的弹窗bug,同时查看详细购买日志。
内容的提问来源于stack exchange,提问作者Shashan Kaf
相关产品推荐
相关产品推荐

