【问题标题】:SwiftyStoreKit - How to properly restore auto renewable subscriptions?SwiftyStoreKit - 如何正确恢复自动更新订阅?
【发布时间】:2019-12-17 05:07:04
【问题描述】:

所以我在应用程序中有一个非常基本的自动更新订阅概念,它可以解锁 PRO 功能。 我还有一个非消耗品购买,它是“一次性购买订阅”,它可以永久解锁 PRO 功能。

我无法理解的是,当我调用 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))
  }

所以目前在我的应用程序中发生的情况是,即使用户有一个有效订阅,如果他或她尝试restorePurchasesverifyPurchase 最后一次购买验证有可能是一个过期的订阅,导致为用户取消的应用程序专业版,即使有有效的订阅。

避免此错误并始终验证唯一正确订阅的最佳做法是什么?

【问题讨论】:

  • 如果您打算在应用程序中进行自动更新订阅并从应用程序中赚取超过 100 美元,那么您绝对应该拥有自己的后端服务器来执行所有逻辑以及服务器挂钩和收据刷新.查看更多@medium.com/@chriseelmaa/…

标签: ios swift in-app-purchase swiftystorekit


【解决方案1】:

来自SwiftyStoreKit docs

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 以确定特定订阅是否仍然有效。

您可能不想在每次应用启动时都执行此操作,因此您应该将结果缓存在某处 - 您可能需要的只是到期日期。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-07-30
  • 2014-04-17
  • 1970-01-01
  • 2018-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-24
相关资源
最近更新 更多