该技能用于在 Expo React Native 应用中集成或修复 RevenueCat 与 Superwall,核心是先确定购买完成的唯一归属方,再编写代码;不得借集成之机更改账户或恢复策略。使用前应检查 lockfile、Expo 配置、实际应用根目录、认证协调器、现有计费调用、商品目录与权益校验,公共 SDK 密钥通过项目环境变量处理,禁止在客户端嵌入密钥或 webhook 凭据。
架构上按 references/architecture-decision-tree.md 选择:若 RevenueCat 负责购买执行与权益,使用 Superwall 的 CustomPurchaseControllerProvider、精确的 RevenueCat 购买 API,并做一次完整权益同步;若 Superwall 或既有计费负责完成,RevenueCat 可用 purchasesAreCompletedBy 观察。两者不可同时完成同一笔交易。
实现要点包括:只初始化一次,RevenueCat 配置完成后才挂载调用代码;按商品、基础方案和可选优惠匹配 Android 订阅,明确不可用的优惠应失败关闭而非回退默认项;区分已购买、已取消、待处理和失败,完成扣款但权益未激活属于履约问题,不应重复扣款修复;使用 addCustomerInfoUpdateListener(返回 void)并以同一回调调用 removeCustomerInfoUpdateListener,先注册再首次拉取;账户切换使用相同的不透明计费 ID,串行化原生身份调用并设置身份修订号;恢复仅由用户触发,历史导入使用批准检查点和 syncPurchasesForResult。
验证可运行:python3 "$SKILL_DIR/scripts/validate_expo_setup.py" --project-root /path/to/app、python3 -m unittest discover -s "$SKILL_DIR/tests" -v、node --test "$SKILL_DIR/tests/billing-contracts.test.cjs"。扫描器只输出静态清单,不执行动态 Expo 配置,零退出码不代表计费就绪。需对适配示例做类型检查、核对合并后的原生清单,并在真实开发和商店沙盒构建中覆盖不可用优惠、重复挂载卸载、竞态、账户切换、取消、待处理、延迟权益、重装等场景。最终需报告归属方、改动文件、精确版本、实际测试及未解决问题。客户端 UI 门控不能替代服务端授权。