
Expo 应用在 iOS 沙盒测试中订阅弹窗无限重弹,根本原因是 RevenueCat SDK 无法正确初始化——通常因环境变量(如 REVENUECAT_API_KEY 和 REVENUECAT_APP_USER_ID)未被正确注入导致,而非代码逻辑或 App Store 配置问题。
expo 应用在 ios 沙盒测试中订阅弹窗无限重弹,根本原因是 revenuecat sdk 无法正确初始化——通常因环境变量(如 `revenuecat_api_key` 和 `revenuecat_app_user_id`)未被正确注入导致,而非代码逻辑或 app store 配置问题。
在 Expo(尤其是 SDK 48+)中,环境变量默认不会自动打包进应用构建产物,即使你在本地 .env 文件中配置了 REVENUECAT_API_KEY 或 RC_ENV,若未显式声明并注入,RevenueCat 初始化将失败——此时 Purchases.purchasePackage() 实际未真正触发 IAP 流程,SDK 内部降级为“空操作”,沙盒支付弹窗因校验失败而反复重试,且 purchaserInfo 不返回、控制台无日志、RevenueCat 后台无记录。
✅ 正确做法:使用 Expo 的 app.config.js(推荐)或 app.json 显式注入环境变量:
// app.config.js
export default ({ config }) => ({
...config,
extra: {
revenuecatApiKey: process.env.REVENUECAT_API_KEY,
rcEnvironment: process.env.RC_ENV || 'Sandbox',
},
});
然后在 JS 中安全读取:
import Constants from 'expo-constants';
const { revenuecatApiKey } = Constants.expoConfig?.extra || {};
if (!revenuecatApiKey) {
console.warn('⚠️ RevenueCat API key missing in extra config!');
}
// 初始化 RevenueCat(务必在 App 启动时调用)
useEffect(() => {
Purchases.setLogLevel(Purchases.LogLevel.DEBUG); // 开启调试日志
Purchases.configure({
apiKey: revenuecatApiKey,
appUserId: 'your_user_id_or_null', // 生产建议传 auth token,沙盒可传 null(由 RC 自动生成)
});
}, []);
⚠️ 关键注意事项:
- 不要在代码中硬编码密钥,但更不能完全依赖 .env —— Expo 构建时不会解析它;
- iOS 模拟器不支持 StoreKit 沙盒支付(Apple 官方限制),必须使用真机 + 已登出的 Apple ID + Sandbox 测试账户;
- 确保 app.json/app.config.js 中已启用 IAP 权限(ios.usesIAP 为 true);
- 调用 purchasePackage 前,务必确认 Purchases.isConfigured() 返回 true,否则静默失败;
- 沙盒用户需在 App Store Connect > Users and Access > Sandbox Testers 中创建,并在设备上完全退出当前 Apple ID 后重新登录该测试账号。
最后验证:开启 Purchases.setLogLevel(Purchases.LogLevel.DEBUG),观察控制台是否输出 DEBUG - Purchases: SDK configured successfully 及后续 initiating purchase 日志。只有看到这些,才表明 SDK 正常工作,沙盒弹窗才能完成闭环并同步至 RevenueCat 控制台。











