用途
该技能用于配置 RevenueCat 内购的测试环境,使开发者可以在不产生真实扣费的情况下测试购买流程。适用于用户提出「测试 RevenueCat 购买」「沙盒配置」「StoreKit」等需求时。
平台识别
技能首先检查工作目录,按从上到下的顺序选取第一个匹配项:
- React Native:package.json 中包含 react-native-purchases 条目,或以 react-native 作为依赖 → 读取 platforms/react-native.md;若同时依赖 expo,则标记为 Expo 项目。
- Flutter:项目根目录存在 pubspec.yaml → 读取 platforms/flutter.md。
- Kotlin Multiplatform:build.gradle.kts 中包含 kotlin { … } 多平台 source sets 块,或依赖 com.revenuecat.purchases:purchases-kmp* → 读取 platforms/kmp.md。
- Android(原生):build.gradle(.kts) 应用了 com.android.application 且不属于 KMP → 读取 platforms/android.md。
- iOS(原生):项目根目录存在 Package.swift、.xcodeproj、.xcworkspace 或 Podfile → 读取 platforms/ios.md。
若多个条件同时匹配(例如 Flutter 项目中包含 ios/ 目录),选择最外层、拥有构建的那个项目。若仍无法确定,则询问用户想配置哪个平台。
测试渠道与取舍
开发期间无法收取真实费用。每个商店都有专门的测试渠道,渠道选择取决于要测试的内容。还原度越高,走到的真实购买链路越多;还原度越低,迭代越快。
- RevenueCat Test Store(还原度最低、迭代最快、结果确定性):由 RevenueCat 托管的合成商店。SDK 使用看板中的 test_… API 密钥进行配置。购买时弹出 Test Store 对话框,手动选择结果:Successful Purchase、Failed Purchase 或 Cancel。购买会触发权益、更新 CustomerInfo,并出现在看板上,但不会调用 Apple 或 Google。适合付费墙迭代、集成测试和 CI 冒烟运行。
- iOS StoreKit 配置文件(低还原度,Apple 合成):Xcode 在本地模拟商店,购买立即成功,无需往返 App Store Connect。适用于需要 StoreKit 特定行为时。此模式下 RevenueCat 交易是否出现在看板取决于 SDK 版本与预期路由,因此不是忠实的看板测试。
- iOS 沙盒(真实沙盒 Apple ID)/Android 内部测试(许可测试者):真实商店后端、真实 RevenueCat 看板摄取、真实收据。迭代较慢,需要构建、安装、等待 Play 传播或 App Store Connect 注册商品。
- TestFlight(iOS)/封闭或开放测试(Android):行为非常接近生产,收据为生产风格,交易进入生产 RevenueCat 看板而非 Sandbox 视图。
- 生产环境:真实付费,不要用于测试。
建议从能回答当前问题的最低还原度开始,再逐步向上。UI 与付费墙迭代属于快速渠道;「我的权益是否真的翻转」属于沙盒或内部测试。
Test Store 的适用时机
RevenueCat Test Store 是按项目在看板上配置的合成商店提供方。它产生真实的 RevenueCat 后端记录(CustomerInfo 更新、权益转换、看板交易),但不调用 App Store 或 Google Play。代价是还原度:Test Store 不模拟 Ask to Buy 审批流程、地区特定定价、服务端收据验证细节、商店层面的审核或拒绝路径,以及完整的订阅续订节奏(Test Store 在压缩时钟上最多续订五次)。
当需要快速迭代 UI、编写结果确定的集成测试或运行 CI 检查时使用 Test Store。任何涉及商店侧行为的测试,都应升级到 App Store 沙盒或 Google Play 内部测试。
配置方式:在看板中进入 Apps and providers → Test configuration 区域 → Test Store → Create / Enable。Test Store API 密钥出现在 Project Settings → API keys 下,带 test_ 前缀。在调试构建中用测试密钥配置 SDK,在发布构建中用生产密钥(appl_… / goog_…)。各平台文件展示了按平台切换密钥的模式。
Test Store 密钥绝不能发布到生产环境,必须通过构建配置加以限制,使发布二进制无法路由到 Test Store。
沙盒与看板注意事项
沙盒交易单独显示:RevenueCat 看板在 Sandbox 与 Production 视图之间有切换。沙盒购买只出现在 Sandbox 下。若测试交易未出现在那里,说明 SDK 未上报(检查 API 密钥、configure 调用与网络),或该购买针对的是不触及 RevenueCat 后端的 StoreKit 配置文件。
沙盒中的加速续订:订阅续订在沙盒中按加速测试时钟运行,可在几分钟内而非数周内验证续订逻辑。iOS 沙盒续订节奏(据 Apple 文档):每日 → 每 3 分钟,每周 → 每 3 分钟,每月 → 每 5 分钟,2 个月 → 每 10 分钟,3 个月 → 每 15 分钟,6 个月 → 每 30 分钟,每年 → 每小时。订阅最多自动续订 6 次后过期。Android 沙盒续订节奏记录在 Google Play Console → Subscriptions testing 中,许可测试者订阅按同样的加速时钟续订。
首次购买流程使用全新测试用户:购买历史绑定在测试账号(沙盒 Apple ID 或许可测试者 Gmail)上并会保留。对已使用过相关权益的账号测试「首次购买」逻辑、介绍性优惠或免费试用会得到误导性结果。应为干净的首购场景创建新的沙盒测试者。
以看板而非设备为准进行确认:设备上购买成功不等于 RevenueCat 已记录。始终确认:交易出现在 RevenueCat 看板(Sandbox 视图);预期的 appUserID 拥有该交易;该用户上预期权益现已激活。若设备显示成功而看板没有记录,问题出在配置链路上,而非商店。
实现与验证
根据识别结果读取对应平台文件:platforms/ios.md、platforms/android.md、platforms/kmp.md、platforms/flutter.md、platforms/react-native.md。
当以下四项均满足时,测试环境才算配置完成:测试用户的测试购买端到端成功;交易出现在 RevenueCat 看板 Sandbox 视图,并归属于登录时使用的 appUserID;购买完成后预期权益在 customerInfo 上处于激活状态;在应用全新安装后恢复购买,仍将权益恢复到同一测试用户。若任一步骤失败,环境尚未就绪,revenuecat-troubleshoot 技能覆盖了常见的根本原因。