При покупке подписки IAP транзакция показывает неправильное состояние - PullRequest
2 голосов
/ 08 апреля 2020

Я портирую наше приложение 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)
    }

Что мне не хватает, пожалуйста?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...