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会一直保留首次购买的日期。
给你现有离线判定逻辑的小优化建议
结合上面的字段含义,你可以把现有逻辑补得更严谨:
- 先查
cancellation_date:如果存在,直接判定订阅失效(注意:只有苹果退款取消才会立刻出现这个字段;用户主动关闭自动续订的话,这个字段要等到试玩/订阅到期后才会生成)。 - 没有
cancellation_date时:- 先看
is_in_intro_offer_period:如果是true,只要expires_date在有效期内,就判定为试玩状态。 - 如果
is_in_intro_offer_period是false,再检查purchase_date和expires_date:只要expires_date没过期,就判定为活跃订阅状态。
- 先看
- 一定要坚持定期用
SKReceiptRefreshRequest刷新收据,保证拿到的字段都是最新状态——毕竟用户可能在其他设备上操作了订阅,本地收据不会自动同步。
内容的提问来源于stack exchange,提问作者Neeraj
相关产品推荐
相关产品推荐

