ios - paymentQueue - 交易失败

标签 ios swift swift3 in-app-purchase

我正在构建一个包含应用内购买的应用。该应用程序有 6 种待售产品(全部为消耗品)。

该应用程序能够使用以下代码识别可供购买的产品(来自 itunes connect):

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.


    //Apple Store
    appleStoreProducts = [productID, product5ID, product25ID, product100ID, product500ID, product1000ID]
    SKPaymentQueue.default().add(self)
    self.getProductInfo()
}

func getProductInfo() {
    if SKPaymentQueue.canMakePayments() {

        for product in appleStoreProducts {
         let request = SKProductsRequest(productIdentifiers: NSSet(objects: product) as! Set<String>)
        request.delegate = self
        request.start()
        }
    } else {
        // Tell user that In-App Purchase is disabled in settings

        print("In-App Purchase is disabled in settings")
    }
}

func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {

    var products = response.products

    if (products.count != 0) {
        let newProduct = products[0]
        switch newProduct.localizedTitle {
        case "DOLLAR":
            product = newProduct
        case "five dollars":
            product2 = newProduct
        case "twenty five":
            product3 = newProduct
        case "one hundred dollars":
            product4 = newProduct
        case "thousand dollars":
            product5 = newProduct
        default:
            print("none of the above")
        }

        print("titile : \(newProduct.localizedTitle) \n description: \(newProduct.localizedDescription)")
    }
    else {
        print("Product not found")
    }

    let invalids = response.invalidProductIdentifiers

    for product in invalids {
        print("Product not found: \(product)")
    }
}

然后您可以点击一个按钮来购买其中一件商品,例如:

  @IBAction func productOne(_ sender: Any) {
    let payment = SKPayment(product: product!)
    SKPaymentQueue.default().add(payment)
}

接下来会出现我的问题,当调用 paymentQueue 方法时:

  func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {

    for transaction in transactions {

        switch transaction.transactionState {

        case SKPaymentTransactionState.purchased:
        //  self.pointsBought()
            SKPaymentQueue.default().finishTransaction(transaction)

        case SKPaymentTransactionState.failed:
             SKPaymentQueue.default().finishTransaction(transaction)
            print("transaction failed")
        default:
            print("ESTDO:  \(transaction.transactionState)")
            break
        }

    }
}

当我点击一次按钮时,这个方法被调用两次。第一次 transactionState 既不是“已购买”也不是“失败”,因此它调用默认选项。第二次的结果是“失败”。但是,我不知道我做错了什么。

相关信息: 我正在使用 iOS 设备 (iphone 6) 来运行该应用程序 我在我的 iPhone 中使用(应用程序的)开发者帐户

最佳答案

您未能涵盖所有情况。您需要涵盖所有这些,并且您需要为某些情况调用 finishTransaction。这是正确的 updatedTransactions 方法的格式:

func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
    for t in transactions {
        switch t.transactionState {
        case .purchasing, .deferred: break // do nothing
        case .purchased, .restored:
            let p = t.payment
            if p.productIdentifier == whatever {
                // ... do stuff ...
                queue.finishTransaction(t)
            }
        case .failed:
            queue.finishTransaction(t)
        }
    }
}

关于ios - paymentQueue - 交易失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45405774/

相关文章:

ios - 更改swift4中while循环的声音文件

swift - 在 Swift 中重新创建 Functor 类型

swift - 使用全局函数永远重复一个 Action

ios - 无法在 iOS 的某些设备中获取 FCM 通知

ios - 与 UIActivityViewController 共享文本文件

ios - 使用 dataTaskWithRequest 填充 uitableview

ios - 按最高价格解析排序

swift3 - Swift 3 中 `setImageWith(_:placeholderImage:usingActivityIndicatorStyle:)` 的使用不明确

ios - NSLocationAlwaysAndWhenInUseUsageDescription 的字符限制是多少?

ios - 如何本地化我的 UITabBarItems?