处理恢复购买时如何处理旧交易?

Hou*_*man 6 in-app-purchase ios swift

我目前正在使用沙盒用户开发和测试我的应用.即使事务已经完成,当我尝试时Restore Purchases,我从队列中获得了多达32个旧事务.

基本上我想提醒它,Your purchase is being restored. Upon completion this dialog will close.并在它完成时解雇它.

private func showRestoreInProgressAlert() {
        let alert = UIAlertController(title: "Restoring Purchase", message: "Your purchase history is being restored. Upon completion this dialog will close.", preferredStyle: .alert)
        present(alert, animated: true, completion: nil)

        NotificationCenter.default.addObserver(self, selector: #selector(dismissRestoreInProgressAlert(notification:)), name: SubscriptionService.restoreSuccessfulNotification, object: nil)
    }
Run Code Online (Sandbox Code Playgroud)

您可以从下面识别此方法SKPaymentTransactionObserver.一旦.restoreSuccessfulNotification发送通知,警报将按预期被解除.但由于队列中有32个事务,弹出窗口不断出现并消失32次.

func handleRestoredState(for transaction: SKPaymentTransaction, in queue: SKPaymentQueue) {
        print("Purchase restored for product id: \(transaction.payment.productIdentifier)")
        queue.finishTransaction(transaction)
        SubscriptionService.shared.uploadReceipt { (success) in
            DispatchQueue.main.async {
                NotificationCenter.default.post(name: SubscriptionService.restoreSuccessfulNotification, object: nil)
            }
        }
    }


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)
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

我已经完成的交易都在handlePurchasedStatehandleRestoredState这样的:

queue.finishTransaction(transaction)
Run Code Online (Sandbox Code Playgroud)

那么,为什么每当我点击恢复购买时,我仍然会在队列中放置这么多旧交易?

UPDATE

这可能确实是沙箱的问题.

我试图做一个计数,但这没有帮助,因为并非所有这些交易似乎都是可恢复的.

我做了"硬重置":

for transaction: AnyObject in SKPaymentQueue.default().transactions {
            guard let currentTransaction: SKPaymentTransaction = transaction as? SKPaymentTransaction else {return}
            SKPaymentQueue.default().finishTransaction(transaction as! SKPaymentTransaction)
        }
Run Code Online (Sandbox Code Playgroud)

现在似乎交易缓慢减少到零,这意味着Sandbox正在失去它们.

为什么SKPaymentQueue.default().finishTransaction()工作,但queue.finishTransaction()没有?我应该重构我的代码SKPaymentQueue.default().finishTransaction()而不是安全吗?或者这只是IAP沙箱的糟糕日子?

Pau*_*w11 5

恢复将所有购买重新交付给您的交易观察者委托。这就是预期的行为。

但是,以您想要的方式显示警报非常简单。

  1. 当用户开始恢复操作时,显示警报。

  2. 然后,一旦所有项目都恢复,您将调用paymentQueueRestoreCompletedTransactionsFinished委托方法。通过这种方法,您可以消除警报。