代码之家  ›  专栏  ›  技术社区  ›  Tulon

如何检测应用内购买底部弹出窗口何时快速向上滑动

  •  0
  • Tulon  · 技术社区  · 4 年前

    我需要检测底部的应用内购买弹出窗口何时打开。在我目前的开发中,当用户点击特定产品包的“购买按钮”时,我会显示一个活动指示器。指示器将一直加载,直到整个购买过程完成。

    但我想在显示底部购买弹出窗口警报时停止活动指示器,并且当用户填写完所有凭据并点击底部弹出窗口上的订阅按钮时,指示器将再次旋转。我怎么能发现呢?

    在我当前的实现中,当用户点击购买按钮时,我会从一开始就启动活动指示器,如下所示:

    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")
            }
        }
    }
    

    enter image description here

    0 回复  |  直到 4 年前