2015-09-06 34 views
3

好的,所以我在Swift工作,我只需要帮助。我遵循了4个不同的教程,关于如何在Swift套件中使用Swift在应用程序购买中实现,逐字复制代码,并且没有任何内容适用于我。Swift,spritekit:在应用程序购买代码运行时,什么都没有发生?

这里是我所采取的步骤:

  1. 飘在iTunes Connect,并在我的应用程序的记录在应用程序内购买创建的。我在应用程序内购买的产品ID为"GameOverSaveSavior"

  2. 在Xcode中,我已经把我的应用程序在应用程序内购买能力ON,确信我的团队设置为我的帐户,并在信息完全相信我的捆绑标识符设置为在iTunes Connect

  3. 我的应用程序的包标识编写任何代码之前,我在GameScene.swift文件

至于代码有import StoreKit,这是我做了什么:

(1)在Gamescene.swift,在我的didMoveToView FUNC结束时,我有:

// Set IAPS 
     if(SKPaymentQueue.canMakePayments()) { 
      println("IAP is enabled, loading") 
      var productID:NSSet = NSSet(objects: "GameOverSaveSavior") 
      var request: SKProductsRequest = SKProductsRequest(productIdentifiers: productID as Set<NSObject>) 
      request.delegate = self 
      request.start() 
     } else { 
      println("please enable IAPS") 
     } 

运行该应用时,该输出"IAP is enabled, loading"

(2)在GameScene.swift,类内但didMoveToView外,我所有的函数和变量他人在应用内购买用于:

var list = [SKProduct]() 
var p = SKProduct() 

    func purchaseMade() { 
     println("they bought it!") 
    } 

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

     var pay = SKPayment(product: p) 
     SKPaymentQueue.defaultQueue().addTransactionObserver(self) 
     SKPaymentQueue.defaultQueue().addPayment(pay as SKPayment) 
    } 
    func productsRequest(request: SKProductsRequest!, didReceiveResponse response: SKProductsResponse!) { 
     println("product request") 
     var myProduct = response.products 

     for product in myProduct { 
      println("product added") 
      println(product.productIdentifier) 
      println(product.localizedTitle) 
      println(product.localizedDescription) 
      println(product.price) 

      list.append(product as! SKProduct) 
     } 
    } 

    func paymentQueueRestoreCompletedTransactionsFinished(queue: SKPaymentQueue!) { 
     println("transactions restored") 

     var purchasedItemIDS = [] 
     for transaction in queue.transactions { 
      var t: SKPaymentTransaction = transaction as! SKPaymentTransaction 

      let prodID = t.payment.productIdentifier as String 

      switch prodID { 
      case "GameOverSaveSavior": 

       purchaseMade() 

       //Right here is where you should put the function that you want to execute when your in app purchase is complete 
      default: 
       println("IAP not setup") 
      } 

     } 

     var alert = UIAlertView(title: "Thank You", message: "Your purchase(s) were restored. You may have to restart the app before banner ads are removed.", delegate: nil, cancelButtonTitle: "OK") 
     alert.show() 
    } 


    func paymentQueue(queue: SKPaymentQueue!, updatedTransactions transactions: [AnyObject]!) { 
     println("add paymnet") 

     for transaction:AnyObject in transactions { 
      var trans = transaction as! SKPaymentTransaction 
      println(trans.error) 

      switch trans.transactionState { 

      case .Purchased, .Restored: 
       println("buy, ok unlock iap here") 
       println(p.productIdentifier) 

       let prodID = p.productIdentifier as String 
       switch prodID { 
       case "GameOverSaveSavior": 

        //Here you should put the function you want to execute when the purchase is complete 
        var alert = UIAlertView(title: "Thank You", message: "You may have to restart the app before the banner ads are removed.", delegate: nil, cancelButtonTitle: "OK") 
        alert.show() 
       default: 
        println("IAP not setup") 
       } 

       queue.finishTransaction(trans) 
       break; 
      case .Failed: 
       println("buy error") 
       queue.finishTransaction(trans) 
       break; 
      default: 
       println("default") 
       break; 

      } 
     } 
    } 

    func finishTransaction(trans:SKPaymentTransaction) 
    { 
     println("finish trans") 
    } 
    func paymentQueue(queue: SKPaymentQueue!, removedTransactions transactions: [AnyObject]!) 
    { 
     println("remove trans"); 
    } 

此输出"product request"到控制台时应用程序已运行。

(3)在GameScene.swift,在我touchesBegan FUNC,我有当右侧按钮被触摸如下:

//In app purchase 
      if touchedNode == saveMeBtn { 

       println("button touched!") 
       for product in list { 
        var prodID = product.productIdentifier 
        if(prodID == "GameOverSaveSavior") { 
         p = product 
         buyProduct() //This is one of the functions we added earlier 
         break; 
        } 
       } 

当按钮被触摸此输出"button touched!"

我不知道我在做什么错。代码编译时没有错误,但是当我的按钮被触摸时没有任何事情发生。没有提醒要求用户登录或购买任何东西 - 没有任何东西。 我主要关注这个问题: in app purchase in SKScene

在编写代码之前,我还应该做些什么吗?我在代码中丢失了什么吗?

+0

@Aidan Kaiser你似乎对IAP的话题非常了解,并且我试图遵循你的其他答案。你知道我做错了吗?任何帮助,非常感谢 – skyguy

+0

“产品添加”,你看到该日志行?你确定你从商店购买产品? – giorashc

+0

@giorashc不,“添加的产品”不会打印到控制台,因此我不能从商店获取产品。我该如何解决这个问题?这是iTunes连接问题吗? – skyguy

回答

0

我想我可以帮到你:

我以前有过你的问题。而另一个类似的一个,我固定在这里:My IAP isn't working. Bugs at func Paymentqueue

这里是我已经找到了解决办法:

删除

SKPaymentQueue.defaultQueue().addTransactionObserver(self) 

无处不在你拥有了它,并把它一次(仅一次)在一个地方,它会在你每次启动应用程序时执行(我把它放在viewDidLoad()中)。

这将检查所有未完成的事务,并在应用程序加载后终止它们,从而在用户触发IAP之前删除任何可能的错误。

(如果这个答案帮助你,别忘了给予好评;))

PS:另外,这不是我的问题,但一定要finishTransaction()每个PurchaseState,喜欢这里:

func paymentQueue(queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { 
     print("Add Payment") 

     for transaction:AnyObject in transactions{ 
      let trans = transaction as! SKPaymentTransaction 
      print(trans.error) 
      switch trans.transactionState{ 
      case .Purchased: 
       print("IAP unlocked") 
       print(p.productIdentifier) 

       let prodID = p.productIdentifier as String 
       switch prodID{ 
       case "IAP id": 
        print("Keep on") 
        keepOn() 
       default: 
        print("IAP not setup") 
       } 
       queue.finishTransaction(trans) 
       break 
      case .Failed: 
       print ("Buy error") 
       queue.finishTransaction(trans) 
       break 
      default: 
       print("default: Error") 
       break 
      } 
     } 
    } 

永远不要忘记这一点:

queue.finishTransaction(trans) 

并作出独立的情况下.Restored。

相关问题