StoreKit 2:如何正确使用自动续订订阅?
StoreKit 2 自动续订订阅完整实现指南
首先明确:仅靠SubscriptionStoreView和.onInAppPurchaseCompletion、.subscriptionStatusTask、.manageSubscriptionsSheet这几个修饰符不足以支撑完整的生产环境订阅功能,StoreKit 2只是帮你简化了UI层和基础交易流程,核心的业务逻辑、权益管理、合规验证都需要你自己补充。下面是具体的实现要点和完整流程:
一、先搞懂你用的核心组件到底做了啥
SubscriptionStoreView:负责拉取App Store Connect中配置的订阅商品(月度/年度Pro),生成标准的订阅选择UI,调起苹果官方支付界面,不用你自己写商品列表和购买按钮。.onInAppPurchaseCompletion:购买操作结束后的回调入口,你需要在这里处理成功/失败的结果,比如给用户反馈、更新本地状态。.subscriptionStatusTask:实时监听用户订阅状态的变化(续订、过期、取消、升级/降级),是同步权益的核心回调。.manageSubscriptionsSheet:快速调起苹果官方的订阅管理界面,满足苹果审核要求的“订阅管理入口”需求。
二、必须补充的关键业务逻辑
1. 订阅权益的精准管理
- 不能只依赖购买完成回调:订阅状态会因为自动续订失败、用户手动取消、苹果退款等情况发生变化,必须通过
subscriptionStatusTask实时将状态同步到本地存储(比如UserDefaults、Core Data)。 - APP启动必查状态:每次APP启动时,主动触发一次订阅状态检查,确保用户打开APP时的权益是最新的,避免本地状态和实际订阅状态不一致。
- 权益判断以状态为准:所有Pro功能的解锁逻辑,都要基于本地存储的订阅状态(比如是否处于有效期内),而不是仅记录“用户购买过”。
2. 交易验证不可少
- StoreKit 2会在客户端自动验证交易的合法性,但生产环境必须做服务器端验证:
- 客户端将交易的
JWSTransaction(或transactionID)发送到你的后端。 - 后端调用苹果的App Store Server API,验证订阅的有效性、到期时间、续订状态、是否退款等信息。
- 最终的权益判断要以服务器验证结果为准,防止越狱设备篡改本地数据绕过付费。
- 客户端将交易的
3. 异常场景的处理
- 购买失败处理:在
.onInAppPurchaseCompletion中捕获StoreError,给用户明确的提示(比如“支付失败,请检查账户余额”“商品暂时不可用”)。 - 订阅状态异常处理:当
subscriptionStatusTask检测到订阅过期、取消时,及时收回Pro权益,弹出引导用户重新订阅的提示;检测到续订成功时,更新有效期。 - 退款与S2S通知:必须在后端监听苹果的Server-to-Server(S2S)通知,一旦收到退款通知,立即收回用户的Pro权益,避免用户退款后仍能使用付费功能。
4. 合规与用户体验
- 强制提供订阅管理入口:除了用
.manageSubscriptionsSheet,还要在APP的设置页、用户中心等明显位置添加“管理订阅”按钮,符合苹果审核规则。 - 清晰的订阅说明:在
SubscriptionStoreView展示前,要明确告知用户订阅价格、续订规则、取消方式(比如“月度订阅¥12,自动续订,可在Apple ID设置中取消”)。 - 优惠/试用的处理:如果设置了免费试用或 introductory offer,要确保
SubscriptionStoreView正确展示,同时在代码中处理试用资格判断(比如用户是否已使用过试用)。
三、完整的运行流程
APP初始化
- 配置
SubscriptionStoreView的商品ID(必须和App Store Connect中创建的订阅组商品ID一致)。 - 主动调用一次订阅状态检查,同步本地用户的Pro权益状态。
- 配置
用户订阅流程
- 用户进入订阅页面,
SubscriptionStoreView自动加载并展示月度/年度订阅选项。 - 用户选择订阅计划,调起苹果支付界面,完成支付操作。
- 用户进入订阅页面,
购买结果处理
.onInAppPurchaseCompletion触发:- 购买成功:更新本地用户状态为Pro,解锁付费功能,同时将交易信息发送到后端做服务器验证。
- 购买失败:提示用户错误原因,引导重试。
订阅状态维护
.subscriptionStatusTask持续监听状态变化:- 续订成功:更新本地订阅有效期,确保权益持续有效。
- 订阅过期/取消:收回Pro权益,提示用户重新订阅。
- 订阅升级/降级:更新本地的订阅计划信息,同步权益级别。
用户管理订阅
- 用户点击“管理订阅”按钮,通过
.manageSubscriptionsSheet调起苹果官方管理界面,修改订阅计划或取消订阅,状态变化会通过subscriptionStatusTask同步到APP。
- 用户点击“管理订阅”按钮,通过
后端同步与S2S通知
- 后端接收客户端的交易信息,调用苹果Server API验证并存储订阅信息。
- 后端监听S2S通知,处理退款、续订失败等事件,同步用户账户状态,必要时通知客户端更新。
四、测试关键要点
- 使用苹果沙盒测试账号进行测试,禁止用真实账号。
- 测试自动续订:沙盒环境下订阅会缩短续订周期(比如月度订阅5分钟后续订),验证状态是否自动更新。
- 测试退款流程:在App Store Connect沙盒测试中发起退款,验证APP和后端是否正确收回权益。
- 测试订阅升级/降级:模拟用户从月度转年度,验证状态和权益是否正确切换。
内容的提问来源于stack exchange,提问作者KatM
相关产品推荐
相关产品推荐

