co-maps/iphone/Maps/Core/InappPurchase/Impl/BillingPendingTransaction.swift

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

60 lines
1.8 KiB
Swift
Raw Permalink Normal View History

2025-11-22 13:58:55 +01:00
final class BillingPendingTransaction: NSObject, IBillingPendingTransaction {
private var pendingTransaction: SKPaymentTransaction?
override init() {
super.init()
SKPaymentQueue.default().add(self)
}
deinit {
SKPaymentQueue.default().remove(self)
}
var status: TransactionStatus {
let routeTransactions = SKPaymentQueue.default().transactions.filter {
var isOk = !Subscription.legacyProductIds.contains($0.payment.productIdentifier) &&
!Subscription.productIds.contains($0.payment.productIdentifier)
if isOk && $0.transactionState == .purchasing {
isOk = false
Statistics.logEvent("Pending_purchasing_transaction",
withParameters: ["productId" : $0.payment.productIdentifier])
}
return isOk
}
if routeTransactions.count > 1 {
pendingTransaction = routeTransactions.last
routeTransactions.prefix(routeTransactions.count - 1).forEach {
SKPaymentQueue.default().finishTransaction($0)
}
} else if routeTransactions.count == 1 {
pendingTransaction = routeTransactions[0]
} else {
return .none
}
switch pendingTransaction!.transactionState {
case .purchasing, .failed:
return .failed
case .purchased, .restored, .deferred:
return .paid
}
}
func finishTransaction() {
guard let transaction = pendingTransaction else {
assert(false, "There is no pending transactions")
return
}
SKPaymentQueue.default().finishTransaction(transaction)
pendingTransaction = nil
}
}
extension BillingPendingTransaction: SKPaymentTransactionObserver {
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
// Do nothing. Only for SKPaymentQueue.default().transactions to work
}
}