gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 22:14:42 24 4
gpt4 key购买 nike

我目前正在与沙盒用户一起开发和测试我的应用程序。即使交易已经完成,当我尝试Restore Purchases 时,我从队列中得到了多达 32 个旧交易。

本质上,我想提醒您 您的购买正在恢复中。完成后,此对话框将关闭。 并在完成后将其关闭。

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)
}

您可能会从下面的 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)
}
}
}

我已经在 handlePurchasedStatehandleRestoredState 中完成交易,如下所示:

queue.finishTransaction(transaction)

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

更新

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

我尝试进行计数,但无济于事,因为并非所有这些交易似乎都可以恢复。

我做了“硬重置”:

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

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

为什么 SKPaymentQueue.default().finishTransaction() 有效,而 queue.finishTransaction() 却没有?为了安全起见,我是否应该重构我的代码以使用 SKPaymentQueue.default().finishTransaction() 而不是?或者这只是 IAP 沙箱的糟糕一天?

最佳答案

恢复将所有购买重新交付给您的交易观察员代表。这是预期的行为。

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

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

  2. 然后,一旦恢复了所有项目,您就会接到一个电话 paymentQueueRestoreCompletedTransactionsFinished委托(delegate)方法。在这种方法中,您可以解除警报。

关于ios - 处理恢复购买时如何处理旧交易?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47870427/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com