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

iOS自动续期IAP本地ASN收据字段使用及订阅状态判定问询

针对你提到的iOS年度订阅(支持不同免费试玩期)的本地收据离线评估问题,我来逐个拆解你的疑问,同时补充一些和你现有判定逻辑适配的细节:

1. 试玩期内用户关闭订阅停止付款,应用怎么获知?

首先得明确:用户在试玩期内关闭自动续订(也就是不想后续付费),不会立刻让收据里的cancellation_date生效——因为用户当前的免费试玩资格还是有效的,直到试玩期结束才会终止订阅。那怎么捕捉这个状态变化呢?

  • 纯离线场景下:只能靠你计划的SKReceiptRefreshRequest定期刷新收据。刷新后,你可以检查auto_renew_status字段:如果变成0,就说明用户已经关闭了自动续订,试玩期结束后不会自动扣费续正式订阅。另外,is_in_intro_offer_period会保持true直到试玩期结束,这也能辅助判断当前阶段。
  • 如果想要更实时的通知,建议结合App Store服务器端通知(比如DID_CHANGE_RENEWAL_STATUS事件),但这需要你的后端服务接收并同步给客户端;要是只做离线评估,定期刷新收据+检查auto_renew_status就是最靠谱的方式。

2. expires_date是「试玩时长+1年」还是仅「1年」?

这个得分场景看:

  • 当用户首次订阅并启用免费试玩期:expires_date是「试玩开始日期 + 试玩时长」,和正式的1年订阅周期没关系。试玩期结束后,如果用户开启了自动续订,苹果会生成新的交易记录,此时新的expires_date才是「正式订阅购买日 + 1年」。
  • 当用户已经处于正式订阅周期(不管是首次付费还是自动续费):expires_date就是当前订阅周期的到期日,也就是购买日加1年的时长。
  • 小提示:你可以通过is_in_intro_offer_period字段快速判断当前是否在试玩/intro优惠期,结合expires_date就能区分是试玩到期还是正式订阅到期。

3. original_purchase_date和purchase_date分别对应什么日期?

这俩字段的含义有明确区分,别搞混:

  • original_purchase_date:是用户第一次购买这个订阅产品的日期——不管当时是开始免费试玩,还是直接付费买正式订阅。比如用户第一次开了7天试玩,这个日期就是试玩启动日;哪怕后来取消又重新订阅(但已经用过试玩期),这个日期还是第一次的那个时间点。
  • purchase_date:对于试玩期的交易,它就是试玩开始的日期(虽然没花钱,但苹果会生成一个免费交易记录);对于正式订阅的交易(包括自动续费的每一次续订),它就是用户实际被扣费的日期。
  • 补充:如果用户在试玩期内升级/转换了订阅套餐,purchase_date会更新为转换的日期,但original_purchase_date会一直保留首次购买的日期。

给你现有离线判定逻辑的小优化建议

结合上面的字段含义,你可以把现有逻辑补得更严谨:

  1. 先查cancellation_date:如果存在,直接判定订阅失效(注意:只有苹果退款取消才会立刻出现这个字段;用户主动关闭自动续订的话,这个字段要等到试玩/订阅到期后才会生成)。
  2. 没有cancellation_date时:
    • 先看is_in_intro_offer_period:如果是true,只要expires_date在有效期内,就判定为试玩状态。
    • 如果is_in_intro_offer_period是false,再检查purchase_date和expires_date:只要expires_date没过期,就判定为活跃订阅状态。
  3. 一定要坚持定期用SKReceiptRefreshRequest刷新收据,保证拿到的字段都是最新状态——毕竟用户可能在其他设备上操作了订阅,本地收据不会自动同步。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:27:28