RevenueCat 接入 Apple App Store 订阅全流程详解(2025 最新)

适用:Flutter / Swift / Objective-C / React Native / Unity

场景:上架 App + 内购订阅(月付/年付)+ RevenueCat 统一管理

一、为什么用 RevenueCat 管理苹果订阅?

Apple IAP(In-App Purchase)本身非常强大,但开发者常常会遇到:

  • 验证票据复杂(Receipt Validation 反作弊)
  • 订阅生效状态难同步(Sandbox 状态混乱)
  • 跨平台权益(iOS + Android)难统一
  • RevenueCat 能自动管理全部

使用 RevenueCat,你可以:

✨ 自动验证订阅(无需自己搭建服务器)

✨ 自动同步跨平台用户 Pro 状态

✨ 显示历史账单、取消原因、续费失败原因

✨ 支持 Offer、价格管理、A/B 测试

✨ 自动处理 Apple 信号(cancel、renew、billing retry 等)

只需 10 行代码即可完成所有 IAP。

二、准备工作

项目

要求

Apple 开发者账号(公司/个人)

已完成银行卡验证

App Store Connect 中已创建 App

不需提交,可是 Draft 状态

已上传一次 build(用于解锁 IAP 功能)

必须,否则找不到 In-App Purchases

RevenueCat 账号

免费版即可

Flutter/Swift 项目已加入 IAP 权限

需开启 In-App Purchase Capability

三、在 App Store Connect 创建订阅项目(Subscription)

重要:必须先创建订阅组(Subscription Group)才能创建订阅产品

步骤 1:进入订阅管理页面

路径:

sql 复制代码
App Store Connect → My Apps → 你的 App →
Features → In-App Purchases → Manage

点击:

步骤 2:创建订阅组(Subscription Group)

示例名称:

  • Linguadiary Pro
  • 或者 Pro Plan

注意:一个订阅组内,用户只能选择一个订阅(例如月付 or 年付)

步骤 3:创建订阅产品(In-App Purchase)

例子:

字段

示例

Reference Name

Linguadiary Monthly Subscription

Product ID

linguadiary_monthly_1

Duration

1 Month

Cleared for Sale

YES

Localization

Title + Description 必填否则审核失败

Apple 要求填写:

(1)标题(Title)

示例:

Linguadiary Monthly Plan

建议 35 字以内

(2)描述(Description)

示例:

Unlock unlimited AI correction and pro features.

建议 55 字以内

(3)价格 / 价格计划(Pricing)

选择 Level 1--87 价格等级。

步骤 4:创建年订阅

同组内再创建一个:

字段

示例

Product ID

linguadiary_yearly_12

Duration

1 Year

价格

Level 2--100

四、将订阅与 App 版本关联(最容易忘记的坑)

必须进行两处绑定:

1. "App 内购买项目"必须勾选订阅

路径:

App Store → Version → In-App Purchases → 选择你的订阅项目 → 保存

否则会出现:

❌ "元数据丢失(Metadata Lost)"

❌ 无法通过审核

❌ RevenueCat 抓不到产品

2. 本地化语言必须在 "订阅组同级的 Localization" 填写

路径:

sql 复制代码
App Store Connect → App Information → Localization

必须填写:

  • App Name
  • Subtitle
  • Description
  • Keywords
  • Support URL
  • Marketing URL

缺少任何一个 → Apple 不让订阅上架 → RevenueCat 显示产品为空。

五、在 RevenueCat 创建 Apple App

路径:

sql 复制代码
RevenueCat → Apps & providers→ Add App → Apple App Store

填写:

  • App Name
  • Bundle ID(必须匹配 App Store Connect )
  • Platform:iOS

然后点击 Add Store

六、在 RevenueCat 添加订阅产品

路径:

sql 复制代码
Products → New Product

添加:

  • linguadiary_monthly_1
  • linguadiary_yearly_12

必须与 App Store Connect Product ID 完全一致(大小写敏感)。

然后创建 Offering:

Offering

包含 Package

default

monthly + yearly

RevenueCat 会自动同步价格、商品信息。

七、在 App 内接入 RevenueCat SDK(Flutter 示例)

1. 初始化 RevenueCat

csharp 复制代码
await Purchases.configure(
  PurchasesConfiguration("public_sdk_key_ios"),
);

2. 获取订阅产品

ini 复制代码
final offerings = await Purchases.getOfferings();
final package = offerings.current?.availablePackages.first;

3. 发起购买

go 复制代码
Purchases.purchasePackage(package);

4. 判断用户是否为 Pro

ini 复制代码
final info = await Purchases.getCustomerInfo();
final isPro = info.entitlements.all["pro"]?.isActive ?? false;

仅以上 4 步即可完成全部逻辑。

八、测试订阅(Sandbox)

添加 Sandbox 测试员

路径:

复制代码
Users and Access → Sandbox Testers

填写:

  • Email(不能是 Apple ID)
  • First/Last Name
  • Password

测试流程:

  1. 在设备登录 Sandbox Apple ID
  2. 安装 TestFlight 构建
  3. 购买订阅
  4. Apple 会用虚拟价格扣费
  5. 生命周期会被加速:
    • Monthly → 5 min
    • Yearly → 1 hour

你可以快速看到:

  • 续费成功
  • 失败 → Billing Retry
  • 取消 → Expire

九、常见坑与解决方案(踩坑大全)

❌ 1. RevenueCat 无法读取产品

原因:

  • 未上传订阅本地化(Title/Description)
  • Product 未添加到 App 版本
  • Subscription Group 未本地化
  • Price 未激活
  • Subscription 未提交审核

❌ 2. App Store Connect 显示「元数据丢失」

原因:

  • 你没有在 App Version 页面勾选订阅项目

必须在这里添加:

sql 复制代码
App → Version → In-App Purchases → Add

❌ 3. Apple 审核拒绝:缺少隐私政策/使用条款

需要在 app 内提供:

  • Privacy Policy 链接
  • Terms of Use / EULA 链接

可用:

arduino 复制代码
https://linguadiary.com/privacy
https://linguadiary.com/terms

十、发布到 App Store

  1. 确保订阅项目已 "Ready to Submit"
  2. App 版本中已勾选订阅
  3. 提交审核
  4. RevenueCat 自动处理所有验证流程
  5. 上架后订阅即可正常工作
相关推荐
stringwu9 小时前
Flutter Generative UI 深度架构剖析与官方 SDK 实战
flutter
游戏开发爱好者810 小时前
iOS 推送怎么配置,APNs 推送证书、设备库与群发
android·ios·小程序·https·uni-app·iphone·webview
唐诺10 小时前
flutter StreamController 完全使用指南
flutter·stream
GitLqr1 天前
玩转 Flutter 中的 Stack 与 Positioned:解决 UI 重叠问题的实战指南
flutter·面试·全栈
Anhty1 天前
2026 实测 4 款 AI 变声器|QQ 聊天伪装声线,告别僵硬假声
人工智能·功能测试·ios·智能手机·安卓
唔661 天前
flutter web iOS 在浏览器加载中文慢的问题
前端·flutter·ios
恋猫de小郭1 天前
Jetpack Compose 8 月版正式发布,核心模块 1.12
android·前端·flutter
ZacJi2 天前
我为 DeepSeek Harness 写了一个 dsh-apple-mode 插件
ios·deepseek·vibecoding
2501_915921432 天前
抓包鹰 Traceeagle 解除证书绑定,SSL Pinning 解除
网络·网络协议·网络安全·ios·adb·https·ssl