我正在关注以下网站上的 IAP 教程: https://betterprogramming.pub/set-up-your-swiftui-app-to-support-in-app-purchases-ef2e0a11d10c
以下是处理交易和状态的代码部分:
extension IAPManager: SKPaymentTransactionObserver {
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
transactions.forEach { (transaction) in
switch transaction.transactionState {
case .purchased:
SKPaymentQueue.default().finishTransaction(transaction)
purchasePublisher.send(("Purchased ",true))
case .restored:
totalRestoredPurchases += 1
SKPaymentQueue.default().finishTransaction(transaction)
purchasePublisher.send(("Restored ",true))
case .failed:
if let error = transaction.error as? SKError {
purchasePublisher.send(("Payment Error \(error.code) ",false))
print("Payment Failed \(error.code)")
}
SKPaymentQueue.default().finishTransaction(transaction)
case .deferred:
print("Ask Mom ...")
purchasePublisher.send(("Payment Diferred ",false))
case .purchasing:
print("working on it...")
purchasePublisher.send(("Payment in Process ",false))
default:
break
}
}
}
}
简而言之,它会针对您向服务器发出的每个购买请求检查队列中的每个案例,并通过如下所示的 purchasePublisher PassThruSubject 将状态发送回 SwiftUI 界面:
let purchasePublisher = PassthroughSubject<(String, Bool), Never>()
这就是我困惑的部分!?我如何访问 purchasePublisher
以便我可以在 SwiftUI 视图(SwiftUI 界面)上检查购买实际上已成功完成,以便我可以采取相应的措施?
答案 0 :(得分:0)
purchasePublisher
是 PassthroughSubject
的一个实例,它是一个向订阅者广播信息的发布者。您必须通过此实例才能访问这些订阅,您可以使用 sink
方法执行此操作:
purchasePublisher.sink(receiveValue: { (value) in
print(value)
})
和往常一样,有一些警告。您可能会发现这样的东西对您正在做的事情很有用:.send() and .sink() do not seem to work anymore for PassthroughSubject in Xcode 11 Beta 5