iOS IAP 支付队列:更新交易



SKPaymentTransactionObserver.paymentQueue:updateTransactions返回一个事务数组。当我付款时,我如何知道我进行的付款是哪笔交易?当我付款时,它总是返回一笔交易吗?

同时,在恢复事务时也会调用此观察器函数。那么,处理更新事务的最佳实践是什么?

顺便说一句,我的订阅产品是自动续订订阅。

遍历事务的循环并检查每个事务。

    public func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
        for transaction in transactions {
            switch (transaction.transactionState) {
            case .purchased:
                completeTransaction(transaction: transaction)
                break
            case .failed:
                failedTransaction(transaction: transaction)
                break
            case .restored:
                restoreTransaction(transaction: transaction)
                break
            case .deferred:
                // TODO show user that is waiting for approval
                break
            case .purchasing:
                break
            }
        }
    }
    private func completeTransaction(transaction: SKPaymentTransaction) {
        print("completeTransaction...")
        deliverPurchaseForIdentifier(identifier: transaction.payment.productIdentifier)
        SKPaymentQueue.default().finishTransaction(transaction)
    }
    private func restoreTransaction(transaction: SKPaymentTransaction) {

        guard let productIdentifier = transaction.original?.payment.productIdentifier else { return }
        print("restoreTransaction... (productIdentifier)")

        deliverPurchaseForIdentifier(identifier: productIdentifier)
        SKPaymentQueue.default().finishTransaction(transaction)
    }
    private func failedTransaction(transaction: SKPaymentTransaction) {
        if let error = transaction.error as NSError? {
            if error.domain == SKErrorDomain {
                // handle all possible errors
                switch (error.code) {
                case SKError.unknown.rawValue:
                    print("Unknown error")
                    BaseViewController.currentViewController?.Alert(title: MFErrors.purchaseFaild.messgae.title, msg: MFErrors.purchaseFaild.messgae.body)
                case SKError.clientInvalid.rawValue:
                    print("client is not allowed to issue the request")
                    BaseViewController.currentViewController?.Alert(title: MFErrors.accountNotAllowedToMakePurchase.messgae.title, msg: MFErrors.accountNotAllowedToMakePurchase.messgae.body)
                case SKError.paymentCancelled.rawValue:
                    print("user cancelled the request")
                case SKError.paymentInvalid.rawValue:
                    print("purchase identifier was invalid")
                case SKError.paymentNotAllowed.rawValue:
                    print("this device is not allowed to make the payment")
                    BaseViewController.currentViewController?.Alert(title: MFErrors.purchaseFaild.messgae.title, msg: MFErrors.purchaseFaild.messgae.body)
                default:
                    break;
                }
            }
            ProgressViewManager.shared.hide()
        }
        SKPaymentQueue.default().finishTransaction(transaction)
    }
    private func deliverPurchaseForIdentifier(identifier: String?) {
        guard let identifier = identifier else { return }
       //Check if this transactions is a subscription
       //SubscriptionsProductIdentifiers is an array of subscriptions product ids you sent to the app store to get SKProducts
        //If subscription
        if SubscriptionsProductIdentifiers.contains(identifier) {

        }else{
           //If non-consumable, consumables etc... 
        }

    }

这是我之前回答中的完整商店经理:如何处理iOS 11中应用内购买的应该添加商店付款?

最新更新