应用内购买不起作用

InAppPurchase doesnt work

我正在制作游戏,遇到了问题: 每次我在里面购物,它 returns 我交易失败。 我调用这个函数来开始交易:

func buyProduct() {
    let payment:SKPayment = SKPayment(product: product)
    SKPaymentQueue.defaultQueue().addPayment(payment)
}

我在 SandBox-testers 中获得了几个用户,并设置了免费的应用内购买价格。 有什么问题?

var product: SKProduct!
//used in viewDidLoad

SKPaymentQueue.defaultQueue().addTransactionObserver(self)
self.getProductInfo()

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

func getProductInfo() {
      if (SKPaymentQueue.canMakePayments()){
           let productID:NSSet = NSSet(object: "id.unique")
           let request:SKProductsRequest = SKProductsRequest(productIdentifiers: productID as Set<NSObject>)
           request.delegate = self
           request.start()
      }

}

func paymentQueue(queue: SKPaymentQueue!, updatedTransactions transactions: [AnyObject]!) {
      for transaction:AnyObject in transactions {
           if let trans:SKPaymentTransaction = transaction as? SKPaymentTransaction{
                switch trans.transactionState{
                case .Purchased:
                     self.removeAds()
                     println("success")
                     SKPaymentQueue.defaultQueue().finishTransaction(transaction as! SKPaymentTransaction)
                     break
                case .Failed:
                     println("failed")
                     showAlert("Error", message: "Ooops, there is transaction problem")
                     SKPaymentQueue.defaultQueue().finishTransaction(transaction as! SKPaymentTransaction)
                     break
                case .Restored:
                     println("restored")
                     SKPaymentQueue.defaultQueue().restoreCompletedTransactions()
                     break
                default:
                     break
                }
           }
      }
}

你在真机上测试过吗?

应用内购买在模拟器上不起作用,会失败并出现类似这样的错误。

Error Domain=SKErrorDomain Code=0 "Cannot connect to iTunes Store" UserInfo=0x7f98b8fda180 {NSLocalizedDescription=Cannot connect to iTunes Store}

IAP 适用于模拟器 6.0 及更高版本,而不适用于以下版本(我认为它对您有利,因为您使用的是 Swift)。

通常,您需要确切的错误信息来确定是什么阻止了这种情况。事务对象中有一个错误 属性,它有 localizedDescription 会告诉您确切的问题。

修改下面的语句以反映该信息,或者简单地使用 NSLog 在控制台中报告错误。如果没有,您可以简单地中断该语句并检查 transaction.error.localizedDescription.

的值
showAlert("Error", message: "Ooops, there is transaction problem")

错误有时可能很简单,因为国家/地区商店与您的 iphone 设置不同(在这种情况下,您的下一次交易无需您做任何事情就会成功),有时可能有非沙盒用户登录了您的iphone 设置。

即使您没有错误信息,也有一些问题要问:

  • 简单检查:你所有的合同都是在 itunesconnect 上签的吗?
  • 最可能的原因:buyProduct() 函数中是否有有效的 SKProduct 对象?您尚未在您的代码中实施 SKRequestDelegate's didFailWithError 方法 - 这可以告诉您您的产品请求有什么问题。如果您不使用有效产品开始付款,则购买注定会失败。而且除了request.start,后面没有办法构造出有效的SKProduct didReceiveResponse.

如果您需要有关如何集成 IAP 的分步教程 - 这里是 my own tutorial and a video lecture series 以及 SWIFT 和 Objective C。它还附带 SWIFT 和 Objective C.

的代码示例