60 lines
1.8 KiB
Swift
60 lines
1.8 KiB
Swift
|
|
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
|
||
|
|
}
|
||
|
|
}
|