在ProductRequest之前解雇PaymentQueue

时间:2015-01-14 13:57:04

标签: ios xcode swift in-app-purchase

我的IAP代码如下。意图是为不同的IAP重用代码。

// Purchase Asked
func purchaseAsked(prodIncoming: String) {

    println("inside purchase Asked")

    switch prodIncoming {
    case "multiTaps":
        prod = "CricketCrazy.UnlockMultiTaps"
    case "ads":
        prod = "CricketCrazy.AdRemoval"
    case "5000Taps":
        prod = "CricketCrazy.TapBlast.5000"
    case "12000Taps":
        prod = "CricketCrazy.TapBlast.12000"
    case "30000Taps":
        prod = "CricketCrazy.TapBlast.30000"
    case "70000Taps":
        prod = "CricketCrazy.TapBlast.70000"
    case "200000Taps":
        prod = "CricketCrazy.TapBlast.200000"
    default:
        break
    }

    println("going to add observer")
    SKPaymentQueue.defaultQueue().addTransactionObserver(self)

    println("going to getProductionInfo")

    if SKPaymentQueue.canMakePayments() {
        //canDoIap = true
        println("canDoIap = true")
        let productID:NSSet = NSSet(object: prod)

        println("productID: \(productID)")
        let productsRequest:SKProductsRequest = SKProductsRequest(productIdentifiers: productID)

        println("request: \(productsRequest)")
        productsRequest.delegate = self
        productsRequest.start()

    } else {
        println("canDoIap = false")
        //canDoIap = false
    }

}

func productsRequest (request: SKProductsRequest!, didReceiveResponse response: SKProductsResponse!) {
    println("inside productRequest function")
    let products = response.products
    if products.count != 0
    {
        product = products[0] as SKProduct
    }

    switch restoring {
    case false:
        println("restoring = false")
        let payment:SKPayment = SKPayment (product: product)
        SKPaymentQueue.defaultQueue().addPayment(payment)
        break
    case true:
        println("restoring = true")
        SKPaymentQueue.defaultQueue().restoreCompletedTransactions()
        break
    default:
        break
    }

}

func paymentQueue(queue: SKPaymentQueue!, updatedTransactions transactions: [AnyObject]!) {
    for transaction:AnyObject in transactions {
        println("inside paymentQueue Fuction")
        if let trans:SKPaymentTransaction = transaction as? SKPaymentTransaction {
            switch trans.transactionState {
            case .Purchased:
                println(".Purchased")
                SKPaymentQueue.defaultQueue().finishTransaction (transaction as SKPaymentTransaction)
                postPurchaseActions(true)
                break
            case .Failed:
                println(".Failed")
                SKPaymentQueue.defaultQueue().finishTransaction (transaction as SKPaymentTransaction)
                postPurchaseActions(false)
                break
            case .Restored:
                println(".Restored")
                SKPaymentQueue.defaultQueue().restoreCompletedTransactions()
                if consumeable == false {
                    postPurchaseActions(true)
                }
                break
            default:
                break
            }
        }
    }
}

问题是你可以从下面的日志中看到。它甚至在它到达productRequest之前触发paymentQueue并尝试恢复IAP(两次)。它甚至尝试恢复可消耗的IAP。 我究竟做错了什么。有没有更好的方法来处理快速项目中的多个IAP。

inside purchase Asked
going to add observer
going to getProductionInfo
canDoIap = true
productID: {(
    "CricketCrazy.AdRemoval"
)}
request: <SKProductsRequest: 0x17063e740>
Purchase
inside paymentQueue Fuction
.Restored
tapBlasts: 0
inside paymentQueue Fuction
.Restored
2015-01-14 08:50:29.497 CricketCrazy[21576:2483010] <SKPaymentQueue: 0x17401d330>: Ignoring restoreCompletedTransactionsWithApplicationUsername: because already restoring transactions
tapBlasts: 0
inside productRequest function
restoring = false
inside paymentQueue Fuction

0 个答案:

没有答案