You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用StoreKit 2实现恢复购买功能并兼容StoreKit 1历史订单

你测试得到的结果属实,默认配置下调用Transaction.latest(for:)查询StoreKit 1产生的历史购买记录,确实会返回nil,该现象是StoreKit 2的默认机制导致,并非你的操作错误。

StoreKit 1 迁移到 StoreKit 2 的正确配置

要兼容旧框架的历史交易,你需要先完成基础配置:

  • 打开Xcode项目的 Signing & Capabilities 面板,找到「In-App Purchase」配置项,勾选 Sync StoreKit 1 transactions 选项。开启该配置后,系统会自动将用户设备上留存的StoreKit 1历史交易同步到StoreKit 2的本地交易数据库,后续你再调用Transaction.latest(for:)就可以查询到旧框架产生的购买记录。
  • 如果你的应用需要兼容iOS 15以下的系统版本,需要保留原有StoreKit 1的完整实现,通过系统版本判断分支执行对应逻辑:iOS 15及以上版本走StoreKit 2逻辑,更低版本走原StoreKit 1逻辑。
  • 如果你的应用本地存储了用户的历史购买凭证,建议新增迁移逻辑,将原有StoreKit 1存储的凭证和StoreKit 2返回的Transaction记录做映射匹配,避免出现权限遗漏或重复校验的问题。
恢复购买功能的实现方案

StoreKit 2的恢复购买逻辑和StoreKit 1有明显差异,不需要调用专门的恢复接口,根据不同场景执行对应逻辑即可:

所有交易有效性校验建议走服务端完成,避免本地校验被破解篡改

  • 应用首次启动自动恢复场景(用户重装应用后首次打开):
    1. 调用Transaction.currentEntitlements接口获取当前Apple ID下所有生效的非消耗品、自动续期订阅购买权限,该接口返回的内容已经包含同步后的StoreKit 1历史交易
    2. 遍历返回的交易数组,逐笔校验交易签名的有效性,根据商品类型、有效期给用户开通对应的使用权限
    3. 如果仅需要查询单个商品的最新购买状态,再调用Transaction.latest(for: 对应商品ID)接口查询即可
  • 用户主动触发恢复场景(应用内设置页的「恢复购买」按钮点击事件):
    1. 首先调用AppStore.sync()接口,触发系统和App Store服务器同步最新的交易数据,避免本地缓存数据不全导致的恢复遗漏
    2. 同步完成后执行上述自动恢复的校验逻辑,完成后给用户弹出对应的恢复结果提示即可

内容的提问来源于stack exchange,提问作者matt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 19:27:04