We have backend validation for receipts, and we call finishTransaction(transaction)
only after backend successfully validates a receipt.
For cases when something wrong happens between a purchase and a receipt validation, I expect paymentQueue(_:updatedTransactions:)
to be called with a transaction that I can handle and extract a previous purchase.
paymentQueue(_:updatedTransactions:)
is called at a regular purchasepaymentQueue(_:updatedTransactions:)
is called for a restore casepaymentQueue(_:updatedTransactions:)
- is not called at app start/resume with a transaction that was not marked finishedSteps to reproduce:
Simplified code looks like:
// Called in `application(_ application: UIApplication, didFinishLaunchingWithOptions` before Firebase and any libs initialization
func initialize() {
SKPaymentQueue.default().add(self)
fetchProducts()
}
// SKPaymentTransactionObserver
func paymentQueue(_: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
transactions.forEach { transaction in
switch transaction.transactionState {
case .purchasing, .deferred:
break
case .purchased:
uploadReceipt {
if case let .success(value) = $0 {
SKPaymentQueue.default().finishTransaction(transaction)
}
}
case .failed:
SKPaymentQueue.default().finishTransaction(transaction)
case .restored:
SKPaymentQueue.default().finishTransaction(transaction)
@unknown default:
break
}
}
}
Any advices?
You should callfinishTransaction
on the SKPaymentQueue
that is passed to the delegate method instead of using SKPaymentQueue.default()