InAppPurchase不起作用

时间:2015-07-01 22:51:48

标签: ios iphone swift in-app-purchase

我正在制作游戏,但我遇到了问题: 每当我在其中进行购买时,它都会返回我失败的交易。 我将此函数称为启动事务:

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

我在SandBox测试人员中获得了几个用户并免费为应用内购买设定了价格。 问题是什么?

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
                }
           }
      }
}

2 个答案:

答案 0 :(得分:0)

你在真实设备上测试了吗?

在应用内购买不能在模拟器上运行,它会失败并出现这样的错误。

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

答案 1 :(得分:0)

IAP可以在模拟器6.0及更高版本上运行,而不是在下面(我认为它对你有利,因为你使用的是Swift)。

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

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

0

错误有时可能与您的iphone设置一样简单,就像不同的国家商店一样简单(在这种情况下,您的下一个交易将在没有您做任何事情的情况下成功),有时可能会在您的iphone设置上登录非沙盒用户。

即使您没有错误信息,也可以提出一些问题:

  • 简单检查:您的所有合同是否都在itunesconnect中签名?
  • 最可能的原因:你在showAlert("Error", message: "Ooops, there is transaction problem") 函数中有一个有效的SKProduct对象吗?您尚未在代码中实施SKRequestDelegate's didFailWithError方法 - 这可以告诉您产品请求有什么问题。如果您没有使用有效产品开始付款,则购买注定会失败。除了buyProduct()之外,没有办法构建有效的SKProduct,然后成功request.start

如果您需要有关如何集成IAP的分步教程 - 这里是my own tutorial和带有SWIFT和Objective C的video lecture series。它还附带SWIFT和Objective C的代码示例。