
Expo + RevenueCat 沙盒测试中订阅弹窗无限重弹,根本原因是环境变量(如 REVENUECAT_API_KEY 和 REVENUECAT_APP_USER_ID)未正确注入应用,导致 Purchases SDK 初始化失败,无法完成购买流程验证与回调。
expo 应用内购买沙盒测试中订阅弹窗无限重弹,根本原因是环境变量(如 `revenuecat_api_key` 和 `revenuecat_app_user_id`)未正确注入应用,导致 purchases sdk 初始化失败,无法完成购买流程验证与回调。
在 Expo 项目中使用 RevenueCat 进行 iOS 沙盒内购测试时,若出现「点击订阅 → 弹出 Apple 沙盒登录窗口 → 输入测试账号密码 → 显示“Done”后立即消失 → 3 秒后再次弹出」的循环现象,且 console.log 完全不执行、RevenueCat 后台无 purchaser 记录,绝大多数情况下并非代码逻辑或 App Store Connect 配置问题,而是 RevenueCat SDK 因缺少必要环境变量而初始化失败,进而导致 purchase 流程静默中断。
关键原因在于:Expo(尤其是 expo-dev-client 或 EAS Build)不会自动将 .env 文件中的变量注入到运行时环境。即使你在本地 .env 中配置了 REVENUECAT_API_KEY,若未显式将其暴露给 JS 层,Purchases.configure() 实际会以 null 或空字符串初始化,SDK 将无法连接 RevenueCat 服务,所有购买回调(包括成功/失败)均不会触发,造成“假完成、真卡死”的现象。
✅ 正确做法是通过 Expo 的 app.config.js(推荐)或 defineConstants 显式注入环境变量:
// app.config.js
export default ({ config }) => {
return {
...config,
ios: {
bundleIdentifier: 'com.yourapp',
// 其他 iOS 配置...
},
android: { /* ... */ },
extra: {
revenuecatApiKey: process.env.REVENUECAT_API_KEY,
// 注意:确保该变量已在 shell 环境或 CI 中设置(如 export REVENUECAT_API_KEY=...)
}
};
};
然后在 JS 中安全读取:
import Constants from 'expo-constants';
const apiKey = Constants.expoConfig?.extra?.revenuecatApiKey;
if (!apiKey) {
console.error('❌ RevenueCat API key is missing — aborting configuration');
throw new Error('Missing REVENUECAT_API_KEY');
}
// 初始化必须在应用启动早期执行(如 App.tsx 的顶层)
Purchases.configure({
apiKey,
appUserID: 'your-test-user-id', // 生产中应动态生成;沙盒测试可固定(但需保持一致)
});
⚠️ 重要注意事项:
- iOS 模拟器不支持 IAP:Apple 明确要求 App Store 内购必须在真机上测试。Simulator(包括 iOS 17)会触发沙盒弹窗但无法完成支付流程,这是预期行为。务必使用已登录沙盒测试账号的 iPhone 真机调试。
- appUserID 不可为空:若传入 null 或 undefined,RevenueCat 会自动生成临时 ID,导致每次 purchase 后 purchaserInfo 不一致,后续 entitlements 查询失败。
- 沙盒用户需在 App Store Connect > Users and Access > Sandbox Testers 中创建,并在真机设置 → App Store → 登出当前 Apple ID,再用沙盒邮箱登录。
- 调试时启用 RevenueCat 日志:Purchases.setLogLevel(Purchases.LOG_LEVEL.DEBUG),可捕获初始化失败、网络请求超时等底层错误。
修复后,你的 subscribe 函数将正常执行完整链路:
✅ 弹窗关闭后立即触发 purchasePackage() 返回;
✅ 控制台输出 purchaserInfo;
✅ getCustomerInfo() 获取最新订阅状态;
✅ 成功导航至 'Account' 页面。
切记:环境变量不是“部署时自动携带”,而是必须主动声明并注入——这是 Expo + RevenueCat 沙盒测试失败最隐蔽也最常见的根源。











