我需要检测底部的应用内购买弹出窗口何时打开。在我目前的开发中,当用户点击特定产品包的“购买按钮”时,我会显示一个活动指示器。指示器将一直加载,直到整个购买过程完成。
但我想在显示底部购买弹出窗口警报时停止活动指示器,并且当用户填写完所有凭据并点击底部弹出窗口上的订阅按钮时,指示器将再次旋转。我怎么能发现呢?
在我当前的实现中,当用户点击购买按钮时,我会从一开始就启动活动指示器,如下所示:
func purchaseProduct(product: SKProduct) -> Bool {
if !IAPManager.shared.canMakePayments() {
return false
} else {
if Reachability.isConnectedToNetwork() {
setActivityIndicator(shouldStart: true)
UserDefaults.standard.set(true, forKey: "receiptValidationAllow")
IAPManager.shared.purchaseProduct(product: product) { (result) in
DispatchQueue.main.async {
switch result {
case .success(let isPurchasedActive):
if isPurchasedActive == true {
self.navigateToHomeViewController()
} else {
GlobalMethod.appdelegate().navigateToInitialViewController()
}
// self.purchasedProductSuccessfully(product: product)
print("finally purchased product \(product.localizedTitle)")
case .failure(let error):
self.showIAPRelatedError(error)
}
self.setActivityIndicator(shouldStart: false)
}
}
} else {
showNoInternetAlert()
}
}
return true
}
此操作调用IAPManager类中的以下函数:
func purchaseProduct(product: SKProduct, withHandler handler: @escaping ((_ result: Result<Bool, Error>) -> Void)) {
let payment = SKPayment(product: product)
SKPaymentQueue.default().add(payment)
// Keep the completion handler.
onBuyProductHandler = handler
}
下面是屏幕上出现的底部弹出窗口。
但我需要检测这个弹出事件。我怎样才能检测到
?
在
updatedTransactions
委托完成事务后触发的所有案例。所以我不能把弹出式触发器放在里面。
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
transactions.forEach { (transaction) in
switch transaction.transactionState {
case .purchased:
SKPaymentQueue.default().finishTransaction(transaction)
case .restored:
totalRestoredPurchases += 1
SKPaymentQueue.default().finishTransaction(transaction)
case .failed:
totalPurchaseOrRestoreFailed += 1
SKPaymentQueue.default().finishTransaction(transaction)
case .deferred, .purchasing: break
@unknown default: break
}
}
}
最后,我调用
removedTransactions
委托,获取处理程序回调并停止按钮内的活动指示器。
func paymentQueue(_ queue: SKPaymentQueue, removedTransactions transactions: [SKPaymentTransaction]) {
print("Removed transactions: \(transactions.count)")
print("Unfinished transaction: \(queue.transactions.count)")
//This will be called after finishing all transactions
if queue.transactions.count == 0 {
if totalPurchaseOrRestoreFailed != 0 {
transactions.forEach { (transaction) in
switch transaction.transactionState {
case .purchased:break
case .restored: break
case .failed:
if let error = transaction.error as? SKError {
if error.code != .paymentCancelled {
onBuyProductHandler?(.failure(error))
} else {
onBuyProductHandler?(.failure(IAPManagerError.paymentWasCancelled))
}
print("IAP Error:", error.localizedDescription)
totalPurchaseOrRestoreFailed = 0
}
case .deferred, .purchasing: break
@unknown default: break
}
}
} else {
self.IAPResponseCheck(iapReceiptValidationFrom: .purchaseAndRestoreButton)
UserDefaults.standard.set(false, forKey: "receiptValidationAllow")
}
}
}