Search code examples
iosstorekit

paymentQueue(_:updatedTransactions:) not called with non finished transactions


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 purchase
  • paymentQueue(_:updatedTransactions:) is called for a restore case
  • paymentQueue(_:updatedTransactions:) - is not called at app start/resume with a transaction that was not marked finished

Steps to reproduce:

  • Initiate an inapp system popup
  • Confirm a purchase when app is closed

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
            }
        }
    }

enter image description here

Any advices?


Solution

  • You should callfinishTransaction on the SKPaymentQueue that is passed to the delegate method instead of using SKPaymentQueue.default()