我的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