【问题标题】:In-app purchase ios sending more transactions than needed应用内购买 ios 发送的交易超出了需要
【发布时间】:2015-12-08 22:28:55
【问题描述】:

我在 SpriteKit 中使用应用内购买。第一次交易很好,但是当我做第二次交易时,我的

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

调用 2 次,而不是 3,4,5

所以我做了一个请求,但它增加了 100 个硬币而不是 50 个...

我猜出了那个函数的问题:

 func buyProduct() {
    print("buy +" + p.productIdentifier)

    var payment = SKMutablePayment(product: p)


    SKPaymentQueue.defaultQueue().addTransactionObserver(self)
    SKPaymentQueue.defaultQueue().addPayment(payment)

}

我也有:

 func productsRequest(request: SKProductsRequest, didReceiveResponse response: SKProductsResponse) {
    var myProduct = response.products
            for product in myProduct {
                list.append(product)
                print("product added")
                print(product.productIdentifier)
                print(product.localizedTitle)


            }
    print("list is \(list)")

}

func paymentQueue(queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
    print(transactions.count)
    for transaction in transactions {
        print(transaction.error)

        switch transaction.transactionState {
        case .Purchased:
            MBProgressHUD.hideAllHUDsForView(self.view, animated: true)
            print("buyed")
            print(p.productIdentifier)
            let prodID = p.productIdentifier

            switch prodID {
            case "com.addCoins" :
                print("increaing coinsCount")
                coinsCount = coinsCount + 50
                let userDefaults = NSUserDefaults.standardUserDefaults()
                userDefaults.setInteger(coinsCount, forKey: "coins")
                userDefaults.synchronize() // don't forget this!!!!
                coinsLabel.text = String(coinsCount)
            default: print("IAD not setuped")
            }

            print("premium added")
            queue.finishTransaction(transaction)
            break
        case .Failed:
            MBProgressHUD.hideAllHUDsForView(self.view, animated: true)
            print("buy error")
            queue.finishTransaction(transaction)
            break
        default: break
        }
    }
}

我打电话购买:

for product in list {
                        let loadingNotification = MBProgressHUD.showHUDAddedTo(self.view, animated: true)
                        loadingNotification.mode = MBProgressHUDMode.Indeterminate
                        loadingNotification.labelText = "Loading"

                        let prodID = product.productIdentifier
                        if prodID == "com.addCoins" {
                            p = product
                            buyProduct()
                            break
                        }

                    }

【问题讨论】:

标签: ios in-app-purchase


【解决方案1】:

在某些时候,您必须告诉 Apple 已完成购买并且您已交付货物。在那之前,购买将永远留在交易队列中。

【讨论】:

  • 那我该怎么做呢?
  • 我尝试添加 SKPaymentQueue.defaultQueue().finishTransaction(transaction as SKPaymentTransaction) 但没有任何变化
【解决方案2】:

添加是不好的做法

 SKPaymentQueue.defaultQueue().addTransactionObserver(self)

每次你买东西。根据苹果推荐的指南,您应该在应用启动时添加事务观察器,并在应用关闭时将其删除。

此外,自 iOS 8 以来,您不再需要为您的 userDefaults 调用同步,但我仍然看到很多人这样做。

关于你的问题,代码似乎没问题。到目前为止,我唯一注意到的是为什么在购买功能中添加 SKMutablePayment? 尝试将 SKMutablePayment 更改为 SKPayment,看看是否有不同。

  func buyProduct() {
print("buy +" + p.productIdentifier)

var payment = SKPayment(product: p)

SKPaymentQueue.defaultQueue().addTransactionObserver(self) // should not be here
SKPaymentQueue.defaultQueue().addPayment(payment)
}

【讨论】:

    猜你喜欢
    • 2017-12-19
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多