Swift,spritekit:在应用程序购买代码运行中,没有发生?

时间:2015-09-06 01:02:18

标签: ios swift sprite-kit in-app-purchase

好的,所以我在Swift工作,我只需要帮助。我已经关注了4个不同的教程,介绍了如何使用Swift在sprite工具包中实现应用程序购买,逐字复制代码,没有什么对我有用。

以下是我采取的步骤:

  1. 已进入Itunes Connect并根据我应用的记录创建了应用内购买。我的应用内购买产品ID为"GameOverSaveSavior"

  2. 在Xcode中,我已将我的应用的应用购买功能转为ON,确保我的团队设置为我的帐户,并确保我的捆绑标识符在信息下已设置为我在iTunes中的应用程序包标识符

  3. 在编写任何代码之前,我的GameScene.swift文件中有import StoreKit

  4. 至于代码,这就是我所做的:

    (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

    在编写代码之前还有什么我应该做的吗?我在代码中遗漏了什么吗?

1 个答案:

答案 0 :(得分:0)

我想我可以帮到你:

过去我有过你的问题。还有一个类似的我在这里修复过:My IAP isn't working. Bugs at func Paymentqueue

这是我找到的解决方案:

删除

SKPaymentQueue.defaultQueue().addTransactionObserver(self) 

在任何地方你都拥有它,并在每次应用程序启动时将其执行一次(仅将其放置)(我将其放在viewDidLoad()中)。

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

(如果这个答案对你有所帮助,请不要忘记upvote;))

P.S。:另外,这不是我的问题,但请确保为每个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制作单独的案例。