开发者社区 问答 正文

SwiftyStoreKit-如何正确恢复自动续订订阅?

因此,我有一个非常基本的概念,自动可再生的订阅,在应用程序中,解锁专业功能。我也有一个非消费购买,这是一个“一次性购买订阅”,其中解锁专业功能一劳永逸。

当我打电话的时候restorePurchases(使用SwiftyStoreKit)它带来了用户所做的所有购买。这些可能包括多次购买相同的订阅,而这些订阅很久以前就过期了。

我接下来要做的就是我称之为verifyPurchase方法检查已购买的每个订阅的过期日期,如果过期,则通过清除密钥链(因为它认为当前订阅过期)从用户那里删除PRO:

case .expired(let expiryDate, let items):
             log.info("Subscription has expired on \(expiryDate)")
             log.debug(items)
             self.activeSubscription = nil
             self.clearStore()
             seal.reject(SubscriptionServiceError.expired(on: expiryDate))
  }

因此,我的应用程序中当前发生的情况是,即使用户有一个活动订阅,如果他或她试图restorePurchases,有可能verifyPurchase最后一次要验证的是过期订阅,结果是取消了该应用程序的PRO版本,即使上面有一个活动订阅。

什么是最好的做法,以避免这一错误,并始终验证一个和唯一正确的订阅?

展开
收起
游客5akardh5cojhg 2019-12-17 15:50:03 2949 分享 版权
阿里云 AI 助理回答

为了避免您描述的问题,确保始终验证到正确的、活动的订阅,可以采取以下几种策略:

  1. 使用最新的购买记录:在处理恢复购买时,不要仅仅基于时间顺序来验证订阅。而是应该查找具有最新有效期或最近购买日期的订阅项。这通常意味着订阅是当前有效的。SwiftyStoreKit 或其他库可能提供了获取最新有效订阅的方法。

  2. 依赖于苹果服务器验证:除了客户端验证之外,利用苹果的服务器端通知(如Receipt Validation)来确认订阅状态是最准确的方式。每当有购买或订阅状态变更时,苹果会向您的服务器发送一个更新的收据。通过验证这个收据(可以使用Apple的服务器端API),您可以确切地知道用户当前的订阅状态,包括是否过期、自动续订等信息。

  3. 维护本地订阅状态:在应用内维护一个清晰的订阅状态模型,当用户购买或续订成功时,不仅更新密钥链中的信息,也在本地数据库或UserDefaults中记录下此订阅的详细信息,包括但不限于产品ID、交易ID、开始日期、结束日期等。这样,在verifyPurchase方法中,您可以优先检查这个本地记录,确保总是基于最新的有效订阅进行判断。

  4. 处理重复购买逻辑:对于同一产品的多次购买,苹果的系统设计通常会避免这种情况导致的问题,因为后续的购买在大多数情况下会被视为续订而非新订阅。但为了保险起见,您的应用逻辑也应该能够识别并忽略那些已由新购买覆盖的旧订阅记录。

  5. 优化verifyPurchase方法:修改该方法以更智能地处理多个订阅记录。例如,先按有效期排序所有订阅项,然后只考虑最晚到期的那个。如果发现有重叠的订阅记录(即用户在同一产品上有多次有效购买),则依据苹果的规则确定哪个是当前有效的(通常是最近的那次购买)。

综上所述,结合客户端逻辑优化与服务器端验证,可以有效避免误判用户订阅状态的情况,确保用户体验不受影响。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答地址: