Swift: 如何解决奇怪的应用内购买行为?

Swift: how to fix strange in-app purchase behavior?

我根据这个使用代码进行应用内购买。但是我 运行 遇到了一些 st运行ge 错误。例如:

FirstViewController 有锁定的内容,PurchasesViewController 有购买按钮。当我点击 PurchasesViewController 中的购买按钮时,确认购买并等待几秒钟以通知购买成功。接下来我回到 FirstViewController 并看到该内容已解锁。在这个例子中,一切正常。但是...

问题:

如果我在 PurchasesViewController 中点击购买按钮,确认购买并且不等待通知,我返回 FirstViewController 并在那里收到通知。我的内容未解锁。即使我重新启动应用程序内容也没有解锁。但是,如果我单击 restore purchases 按钮,所有启动工作正常,锁定的内容将被解锁。

这个问题可能会让用户感到困惑。所以我想锁定界面并显示 activity indicator 直到用户收到有关购买成功的通知。用户在通知中单击“确定”后 windows 我想解锁界面并删除 activity indicator。但是怎么做呢?何时何地调用锁定接口函数?

在我的项目中,我通常使用 https://github.com/SVProgressHUD/SVProgressHUD 来显示加载。在您的情况下,当用户点击购买按钮时,您需要显示 SVProgress.show() 。并在所有购买完成时添加 SVProgress.dismiss() SVProgress.showErrorWithStatus(error.localizedDescription) 当您遇到付款问题时。

在 SKPaymentTransactionObserver 上有 func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) 这个函数你可以像这个例子一样检查状态 paymentQueue:

func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
    for t in transactions {
        switch t.transactionState {
        case .purchasing, .deferred: break // do nothing
        case .purchased, .restored:
            let p = t.payment
            if p.productIdentifier == whatever {
                queue.finishTransaction(t)
                SVProgress.dismiss() 
            }
        case .failed:
            queue.finishTransaction(t)
            SVProgress.showErrorWithStatus("Error message")
        }
    }
}