Ios 如何检查应用内购买(自动续费订阅)的购买状态?
我使用自动续费订阅为该应用创建了应用内购买功能。问题是,我不确定如何检查购买状态,订阅是否已用完或仍处于活动状态 以下是我尝试保存已购买状态的位置:Ios 如何检查应用内购买(自动续费订阅)的购买状态?,ios,swift,in-app-purchase,Ios,Swift,In App Purchase,我使用自动续费订阅为该应用创建了应用内购买功能。问题是,我不确定如何检查购买状态,订阅是否已用完或仍处于活动状态 以下是我尝试保存已购买状态的位置: func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { print("add payment") for transaction: AnyObject in transactions
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
print("add payment")
for transaction: AnyObject in transactions {
let trans = transaction as! SKPaymentTransaction
print(trans.error)
switch trans.transactionState {
case .purchased:
print("buy ok, unlock IAP HERE")
print(p.productIdentifier)
let prodID = p.productIdentifier
switch prodID {
case "com.test.UnlockTools.Subscription1":
print("tool set 1 unlocked")
uTool1()
print("tool set 2 unlocked")
uTool2()
print("tool set 3 unlocked")
uTool3()
UserDefaults.standard.set(true, forKey: "isSubbed")
default:
print("IAP not found")
}
queue.finishTransaction(trans)
case .failed:
print("buy error")
queue.finishTransaction(trans)
break
default:
print("Default")
break
}
}
}
这就是我调用UserDefaults并允许或拒绝按钮交互的地方:
override func viewDidLoad() {
super.viewDidLoad()
if(SKPaymentQueue.canMakePayments()) {
print("IAP is enabled, loading")
let productID: NSSet = NSSet(object: "com.test.UnlockTools.Subscription1")
let request: SKProductsRequest = SKProductsRequest(productIdentifiers: productID as! Set<String>)
request.delegate = self
request.start()
} else {
print("please enable IAPS")
}
status = UserDefaults.standard.bool(forKey: "isSubbed") ?? false
if status == true {
unlockTool1.isUserInteractionEnabled = true
unlockTool2.isUserInteractionEnabled = true
unlockTool3.isUserInteractionEnabled = true
} else {
unlockTool1.isUserInteractionEnabled = false
unlockTool2.isUserInteractionEnabled = false
unlockTool3.isUserInteractionEnabled = false
}
}
override func viewDidLoad(){
super.viewDidLoad()
if(SKPaymentQueue.canMakePayments()){
打印(“IAP已启用,正在加载”)
让productID:NSSet=NSSet(对象:“com.test.UnlockTools.Subscription1”)
let请求:SKProductsRequest=SKProductsRequest(产品标识符:productID as!Set)
request.delegate=self
request.start()
}否则{
打印(“请启用IAPS”)
}
status=UserDefaults.standard.bool(forKey:“isSubbed”)??false
如果状态==true{
unlockTool1.isUserInteractionEnabled=true
unlockTool2.isUserInteractionEnabled=true
unlockTool3.isUserInteractionEnabled=true
}否则{
unlockTool1.isUserInteractionEnabled=false
unlockTool2.isUserInteractionEnabled=false
unlockTool3.isUserInteractionEnabled=false
}
}
如果我找到状态,那么我将能够将状态保存为true/false。我尝试使用UserDefaults并取得了一些成功。但不确定我是否将代码放在了最佳位置
如果订阅仍处于活动状态,我希望允许用户单击按钮,如果订阅已用完,则拒绝按钮单击
如果需要,我将添加更多代码。任何帮助都将不胜感激。检查订阅状态的唯一方法是使用Apple的
/verifyReceipt
端点验证收据是否仍然有效
您可以做的是在购买后缓存一些过期日期,并使用该日期检查订阅是否有效。如果超过了有效期,你可以与苹果公司重新核对收据,看是否续签。还有一些边缘案例,用户在到期日之前被退款,他们的订阅被取消——你应该定期向苹果更新收据,以检查此案例。理想情况下,这一切都应该发生在服务器端,以避免盗版
这里有一篇很好的帖子,很好地总结了苹果订阅带来的烦恼:使用ProductIdentifier检查产品是否已经购买了,怎么样?或者这不适用于订阅?您将使用产品标识符和过期日期来确定订阅是否处于活动状态:啊,好的。我只是在检查是否有办法在收据验证之外获得某种购买状态。但似乎没有别的办法。Thanks@SlavictheSlavic实际上是的。同样的方法,但这个图书馆比以前容易多了TPInAppReceipt'检查一下。