StoreKit2迁移:Product.currentEntitlement与Transaction.currentEntitlements差异及选型
StoreKit2 两段订阅权益代码的差异与推荐方案
核心差异
两段代码在获取权益的范围、可靠性、性能上存在明显区别:
- 获取范围不同:
Transaction.currentEntitlements会返回用户当前所有有效的订阅权益,完全不依赖你提前获取的产品列表——只要用户有有效的订阅(无论你是否在myProducts中包含对应产品),都会被获取到。- 遍历
myProducts逐个获取product.currentEntitlement,只能拿到你提前通过Products.products(...)获取到的那些产品的权益,一旦myProducts不全(比如漏加了新产品、缓存过期),就会漏掉对应权益。
- 可靠性差异:
currentEntitlements直接从StoreKit获取实时的有效权益,自动处理订阅续订、过期、退款等状态变更,数据准确性由StoreKit保证。- 第二种方式依赖你维护的产品列表,如果产品列表获取失败、与App Store不同步(比如你下架/新增了产品但APP未更新),就会出现权益识别错误。
- 性能差异:
currentEntitlements是一次异步流获取所有有效权益,效率更高。- 第二种方式需要逐个await请求,产品数量越多,性能开销越大。
推荐方案:优先使用Transaction.currentEntitlements
针对你的自动续订订阅场景,推荐第一种方案,理由如下:
- 避免权益遗漏:自动续订订阅可能会新增层级或产品,
currentEntitlements能确保你不会因为产品列表未同步而漏掉用户已购买的有效权益,生产环境中不会出现「用户订阅了但功能未解锁」的问题。 - 减少维护成本:不需要额外维护产品列表的获取、缓存和同步逻辑,减少了出错的可能性。
- 状态实时准确:StoreKit会自动处理订阅的所有状态变化(比如自动续订成功、退款取消权益),
currentEntitlements返回的始终是最新的有效权益,无需你手动判断订阅状态。
生产环境的关键差异
在生产环境中,两段代码的差异会被放大:
- 如果使用遍历
myProducts的方式,若myProducts是缓存的旧数据,可能会出现:处理已下架的产品权益(无实际意义)、漏掉用户购买的新产品权益;如果产品列表获取失败,甚至会完全无法识别用户的订阅状态。 Transaction.currentEntitlements不受产品列表的影响,直接从App Store获取用户当前的有效订阅,数据始终与用户实际订阅状态一致,不会出现上述问题。
内容的提问来源于stack exchange,提问作者jboi
相关产品推荐
相关产品推荐

