每个 SKPaymentQueue 的 finishTransaction?

finishTransaction for each SKPaymentQueue?

Documentation for SKPaymentQueue 备注:

To process a payment, first attach at least one observer object to the queue.

我有两个观察者,一个在 AppDelegate(用于提供内容),另一个在 UIViewController(用于根据付款进度更新 UI 状态)。

文档然后说:

Your observer should process the transaction and then remove it from the queue.

这是否意味着我可以像这样在两个观察者(AppDelegateUIViewController)中调用 SKPaymentQueue.default().finishTransaction(transaction)

func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
    for transaction in transactions {
        switch transaction.transactionState {
        case .deferred:
            print("deferred")
        case .purchasing:
            print("purchasing")
        case .purchased:
            SKPaymentQueue.default().finishTransaction(transaction)
        case .failed:
            SKPaymentQueue.default().finishTransaction(transaction)
        case .restored:
            SKPaymentQueue.default().finishTransaction(transaction)
        }
    }
}

我以为SKPaymentQueue.default().finishTransaction(transaction)破坏了所有监听器的交易事件。

最近做了一些类似的实验后,我发现多个 SKPaymentQueue 观察者工作 - 他们都会为每个事务调用。但是在调用 finishTransaction() 之后,将不会调用剩余的观察者(正如您在问题中所猜测的那样,这也是有道理的)。

我还确定观察者似乎总是按照您添加它们的顺序被调用。因此,如果您希望两个观察者始终获得每笔交易,请确保您最后添加的观察者是唯一调用 finishTransaction() 的观察者。

当您显示 SKPaymentTransactionObserver View Controller 时,您可以重新排序观察者,以便在调用 App Delegate 观察者方法之前调用 VC 的方法。

SKPaymentQueue.default().remove(AppDelegate.shared)
SKPaymentQueue.default().add(self)
SKPaymentQueue.default().add(AppDelegate.shared)

或者,我想,完全删除 App Delegate 观察。