首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SwiftyStoreKit -如何正确恢复自动可再生订阅?

SwiftyStoreKit -如何正确恢复自动可再生订阅?
EN

Stack Overflow用户
提问于 2019-12-17 05:07:04
回答 1查看 1.3K关注 0票数 2

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

我无法理解的是,当我调用SwiftyStoreKit) (使用restorePurchases )时,它带来了用户曾经购买过的所有东西。这些可能包括多次购买相同的订阅,而这些订阅很久以前就过期了。

我接下来要做的是对每一次恢复的采购调用一个verifyPurchase方法,该方法检查每一次购买的订阅的过期日期,如果它过期了--它通过清除密钥链(因为它认为当前订阅过期了)从用户那里删除PRO:

代码语言:javascript
复制
  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上一次购买验证将是过期的订阅,从而导致取消的亲版本的应用程序,即使有一个主动订阅。

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

EN

回答 1

Stack Overflow用户

发布于 2019-12-17 14:52:43

来自SwiftyStoreKit文档

代码语言:javascript
复制
let purchaseResult = SwiftyStoreKit.verifySubscription(
        ofType: .autoRenewable, // or .nonRenewing (see below)
        productId: productId,
        inReceipt: receipt)

    switch purchaseResult {
    case .purchased(let expiryDate, let items):
        print("\(productId) is valid until \(expiryDate)\n\(items)\n")
    case .expired(let expiryDate, let items):
        print("\(productId) is expired since \(expiryDate)\n\(items)\n")
    case .notPurchased:
        print("The user has never purchased \(productId)")
    }

看起来,您将传入产品Id,以确定某个特定订阅是否仍处于活动状态。

您可能不想在每次启动应用程序时都这样做,所以您应该将结果缓存到某个地方--您所需要的可能就是到期日期。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59367903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档