Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios SwiftyStoreKit-如何正确恢复自动续费订阅?_Ios_Swift_In App Purchase_Swiftystorekit - Fatal编程技术网

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

Ios SwiftyStoreKit-如何正确恢复自动续费订阅?,ios,swift,in-app-purchase,swiftystorekit,Ios,Swift,In App Purchase,Swiftystorekit,因此,我有一个应用程序中自动续费订阅的基本概念,它解锁了PRO功能。 我还有一个非消耗品购买,这是一个“一次性购买订阅”,它将一次性永远解锁PRO功能 我无法理解的是,当我调用restorepources(使用SwiftyStoreKit)时,它会带来用户曾经进行的所有购买。这些可能包括多次购买同一份早已过期的订阅 接下来我要做的是,我对每个恢复的购买调用verifyPurchase方法,该方法检查曾经购买的每个订阅的过期日期,如果过期,则通过清除keychain(因为它认为当前订阅已过期)将P

因此,我有一个应用程序中自动续费订阅的基本概念,它解锁了PRO功能。 我还有一个非消耗品购买,这是一个“一次性购买订阅”,它将一次性永远解锁PRO功能

我无法理解的是,当我调用
restorepources
(使用SwiftyStoreKit)时,它会带来用户曾经进行的所有购买。这些可能包括多次购买同一份早已过期的订阅

接下来我要做的是,我对每个恢复的购买调用
verifyPurchase
方法,该方法检查曾经购买的每个订阅的过期日期,如果过期,则通过清除keychain(因为它认为当前订阅已过期)将PRO从用户手中夺走:

因此,当前在我的应用程序中发生的情况是,即使用户拥有活动订阅,如果他或她尝试
恢复购买
,则有可能
验证购买
要验证的最后一次购买将是过期订阅,从而导致用户取消应用程序的专业版,即使船上有活跃的订阅

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

来自:

让purchaseResult=SwiftyStoreKit.verifySubscription(
ofType:.autoRenewable、//或.NORENEWING(见下文)
productId:productId,
接收:接收)
交换机购买结果{
购买的案例(让过期,让项目):
打印(“\(产品ID)有效期至\(过期日期)\n\(项目)\n”)
案例。已过期(让expiryDate,让items):
打印(“\(productId)自\(expiryDate)\n\(items)\n)起过期”)
案例。未购买:
打印(“用户从未购买\(productId)”)
}
看起来您将传入产品Id以确定特定订阅是否仍处于活动状态


你可能不想在每次应用发布时都这样做,所以你应该将结果缓存在某个地方——你所需要的可能只是过期日期

如果你计划进行应用内自动续费订阅,并从应用中赚取超过100美元的收入,那么你绝对应该拥有自己的后端服务器,该服务器可以执行所有逻辑,同时还可以进行服务器挂钩和收据刷新。如果我们有多个产品,请查看更多@?
  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))
  }