Swift:恢复应用内购买,没有调用失败案例
Swift: Restore In-App purchase, no fail case called
我可以毫不费力地购买和恢复非消耗品。
但是如果我尝试从从未购买过该产品的帐户恢复,则永远不会调用方法 productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse)
,而在成功恢复时会调用它。
这是我在 class 中符合 SKPaymentTransactionObserver
协议的代码:
public func restorePurchases() {
print("restoring...")
SKPaymentQueue.default().add(self)
SKPaymentQueue.default().restoreCompletedTransactions()
}
public func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
for transaction in transactions {
// finishtTransaction() is called within the sub functions
switch (transaction.transactionState) {
case .purchased:
print("pruchased !")
complete(transaction: transaction)
break
case .failed:
print("failed !")
fail(transaction: transaction)
break
case .restored:
print("restored !")
restore(transaction: transaction)
break
case .deferred:
print("deferred !")
break
case .purchasing:
print("purchasing !")
break
default:
print("default...")
break
}
}
}
请注意,我可以购买和恢复产品,只是在没有任何可恢复的情况下我永远不会收到回复。
其实你只需要实现下面的方法:
public func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue) {
if (queue.transactions.count == 0)
{
print("Nothing to restore...")
}
}
我可以毫不费力地购买和恢复非消耗品。
但是如果我尝试从从未购买过该产品的帐户恢复,则永远不会调用方法 productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse)
,而在成功恢复时会调用它。
这是我在 class 中符合 SKPaymentTransactionObserver
协议的代码:
public func restorePurchases() {
print("restoring...")
SKPaymentQueue.default().add(self)
SKPaymentQueue.default().restoreCompletedTransactions()
}
public func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
for transaction in transactions {
// finishtTransaction() is called within the sub functions
switch (transaction.transactionState) {
case .purchased:
print("pruchased !")
complete(transaction: transaction)
break
case .failed:
print("failed !")
fail(transaction: transaction)
break
case .restored:
print("restored !")
restore(transaction: transaction)
break
case .deferred:
print("deferred !")
break
case .purchasing:
print("purchasing !")
break
default:
print("default...")
break
}
}
}
请注意,我可以购买和恢复产品,只是在没有任何可恢复的情况下我永远不会收到回复。
其实你只需要实现下面的方法:
public func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue) {
if (queue.transactions.count == 0)
{
print("Nothing to restore...")
}
}