Я портирую наше приложение iOS на MacOs и столкнулся со странной проблемой. Когда я покупаю автоматически возобновляемую подписку, состояние данной транзакции не .purchased
, а .restored
. Это не имеет смысла.
@objc func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
for transaction in transactions {
switch transaction.transactionState {
case .purchasing:
handlePurchasingState(for: transaction, in: queue)
case .purchased:
handlePurchasedState(for: transaction, in: queue)
case .restored:
handleRestoredState(for: transaction, in: queue)
case .failed:
handleFailedState(for: transaction, in: queue)
case .deferred:
handleDeferredState(for: transaction, in: queue)
@unknown default:
SwiftyBeaver.debug("Payment: unknown error")
}
}
}
Это неправильно приводит к следующей функции:
func handleRestoredState(for transaction: SKPaymentTransaction, in queue: SKPaymentQueue) {
SKPaymentQueue.default().finishTransaction(transaction)
}
Но из-за того, что ничего не восстанавливается, финальная функция также не вызывается:
@objc func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue) {
// once all items are restored, this gets called here:
verifyWithTegantAPI()
}
Следовательно, наш Api не называется. Теперь пользователь должен go и снова щелкнуть по Восстановить покупки, чтобы активировать покупку, что далеко не идеально.
Если бы транзакция имела правильное состояние, это привело бы к следующему:
func handlePurchasedState(for transaction: SKPaymentTransaction, in queue: SKPaymentQueue) {
SKPaymentQueue.default().finishTransaction(transaction)
verifyWithServerAPI()
}
Сама покупка происходит так:
func purchase(subscription: Subscription) {
SwiftyBeaver.debug(subscription.product.productIdentifier)
let payment = SKPayment(product: subscription.product)
SKPaymentQueue.default().add(payment)
}
Что мне не хватает, пожалуйста?