如何查看In-App Purchase(自动续订)的购买状态?
How to check purchase status of In-App Purchase (Auto Renewing Subscription)?
我使用自动续订订阅为该应用创建了应用内购买功能。问题是我不确定如何检查购买状态,订阅是 运行 到期还是仍然有效。
这是我尝试保存购买状态的地方:
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
}
}
如果我找到状态,那么我就可以将状态保存为 true/false。我尝试使用 UserDefaults 取得了一些成功。不过不确定我是否将代码放在最佳位置。
如果订阅仍然有效,我想允许用户点击一个按钮,如果订阅已经 运行 结束,我会拒绝点击按钮。
如果需要,我会添加更多代码。任何帮助将不胜感激。
检查订阅状态的唯一方法是使用 Apple 的 /verifyReceipt
端点验证收据是否仍然有效 - docs.
您可以做的是在购买后缓存一些到期日期,并使用它来检查订阅是否有效。如果已过期,您可以与 Apple 重新核对收据,看是否已续订。在某些极端情况下,用户会在到期日之前获得退款并且他们的订阅被取消 - 您应该定期与 Apple 更新您的收据以检查这种情况。理想情况下,这也应该发生在服务器端以避免盗版。
这里有一个很棒的 post,很好地总结了 Apple 订阅的优点:iOS Subscriptions are Hard
我使用自动续订订阅为该应用创建了应用内购买功能。问题是我不确定如何检查购买状态,订阅是 运行 到期还是仍然有效。
这是我尝试保存购买状态的地方:
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
}
}
如果我找到状态,那么我就可以将状态保存为 true/false。我尝试使用 UserDefaults 取得了一些成功。不过不确定我是否将代码放在最佳位置。
如果订阅仍然有效,我想允许用户点击一个按钮,如果订阅已经 运行 结束,我会拒绝点击按钮。
如果需要,我会添加更多代码。任何帮助将不胜感激。
检查订阅状态的唯一方法是使用 Apple 的 /verifyReceipt
端点验证收据是否仍然有效 - docs.
您可以做的是在购买后缓存一些到期日期,并使用它来检查订阅是否有效。如果已过期,您可以与 Apple 重新核对收据,看是否已续订。在某些极端情况下,用户会在到期日之前获得退款并且他们的订阅被取消 - 您应该定期与 Apple 更新您的收据以检查这种情况。理想情况下,这也应该发生在服务器端以避免盗版。
这里有一个很棒的 post,很好地总结了 Apple 订阅的优点:iOS Subscriptions are Hard