2

所以我在应用程序中有一个非常基本的自动更新订阅概念,它可以解锁 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最后一次购买验证的订阅可能会过期,从而导致应用程序的 PRO 版本被取消用户,即使在船上有有效订阅。

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

4

1 回答 1

3

来自SwiftyStoreKit 文档

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

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

于 2019-12-17T14:52:43.267 回答