我正在应用购买中实施恢复。我有一个按钮,其动作是
@IBAction func restorePurchases(send : AnyObject){
SKPaymentQueue.defaultQueue().restoreCompletedTransactions()
// if (success) {
// I want to do something here
// }
}
我的问题是。
答案 0 :(得分:26)
if (SKPaymentQueue.canMakePayments()) {
SKPaymentQueue.default().restoreCompletedTransactions()
}
要检查恢复是否良好,您必须遵循协议:
SKPaymentTransactionObserver
然后实现方法:
func paymentQueue(queue: SKPaymentQueue!, updatedTransactions transactions: [AnyObject]!)
并通过以下方式订阅该活动:
SKPaymentQueue.default().add(self)
最后,这是我如何检查结果的例子:
func paymentQueue(_ queue: SKPaymentQueue!, updatedTransactions transactions: [AnyObject]!) {
print("Received Payment Transaction Response from Apple");
for transaction in transactions {
switch transaction.transactionState {
case .purchased, .restored:
print("Purchased purchase/restored")
SKPaymentQueue.default().finishTransaction(transaction as SKPaymentTransaction)
break
case .failed:
print("Purchased Failed")
SKPaymentQueue.default().finishTransaction(transaction as SKPaymentTransaction)
break
default:
print("default")
break
}
}
}
答案 1 :(得分:0)
出于某种原因,即使在尝试 SKPaymentQueue.default().restoreCompletedTransactions()
之后,在恢复期间也从未为我调用以下函数。
func paymentQueue(queue: SKPaymentQueue!,
updatedTransactions transactions: [AnyObject]!)
添加这行代码 SKPaymentQueue.default().add(self)
是为了让我的班级成为观察者,但仍然没有更新。
如果您尝试重新付款,似乎会在恢复的场景中调用此函数,StoreKit API 会自动决定是否应该购买或恢复并相应地显示消息。
即使从用户的角度考虑,他们不会再次收费,苹果拒绝了我们的应用,因为没有添加恢复场景。
因此,如果您在代码中调用 SKPaymentQueue.default().restoreCompletedTransactions()
,请处理这些额外的 StoreKit 委托来管理您的恢复:
func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue) {
handleSuccess()
}
func paymentQueue(_ queue: SKPaymentQueue,
restoreCompletedTransactionsFailedWithError error: Error) {
handleError()
}