
适用: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
测试流程:
- 在设备登录 Sandbox Apple ID
- 安装 TestFlight 构建
- 购买订阅
- Apple 会用虚拟价格扣费
- 生命周期会被加速:
- 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
- 确保订阅项目已 "Ready to Submit"
- App 版本中已勾选订阅
- 提交审核
- RevenueCat 自动处理所有验证流程
- 上架后订阅即可正常工作