我正在我的应用程序中实现IAP。当我在沙盒环境下进行交易时,transactionState .purchasing被调用,然后应用程序显示我成功付款,如下图所示。然而,transactionState .purchasing并没有被调用,我无法处理完成交易。我无法处理完成交易。
下面是我的代码。
class IAPHelper: NSObject {
// MARK: Variables
static let shared = IAPHelper()
private var productsRequest: SKProductsRequest?
private var productsRequestCompletionHandler: ProductsRequestCompletionHandler?
// MARK: Initialization
private override init() {
super.init()
SKPaymentQueue.default().add(self) //for SKPaymentTransactionObserver
clearPendingTransaction()
}
deinit {
SKPaymentQueue.default().remove(self)
}
// MARK: Functionalities
// The reason to implement and call this method here: https://stackoverflow.com/a/42790492/8120939
func clearPendingTransaction() {
for transaction in SKPaymentQueue.default().transactions {
SKPaymentQueue.default().finishTransaction(transaction)
}
}
func requestProducts(productIdentifiers: Set<ProductIdentifier>, _ completionHandler: @escaping ProductsRequestCompletionHandler) {
productsRequest?.cancel()
productsRequestCompletionHandler = completionHandler
productsRequest = SKProductsRequest(productIdentifiers: productIdentifiers)
productsRequest!.delegate = self
productsRequest!.start()
}
public func buyProduct(_ product: SKProduct) {
print("Buying \(product.productIdentifier)...")
let payment = SKPayment(product: product)
SKPaymentQueue.default().add(payment)
}
public func canMakePayments() -> Bool {
return SKPaymentQueue.canMakePayments()
}
static func restorePurchases() {
SKPaymentQueue.default().restoreCompletedTransactions()
}
}
使用Singleton设计模式就可以解决
我用的是 queue.finishTransaction(transaction)
在 .purchased
, .restored
和 .failed
的情况下。仅在以下情况下保存 .purchased
和.restored
. 我想你需要 break
只在 .purchasing
和 default
的案件。