在SKScene的应用程序购买无法正常工作? [英] In app purchase in SKScene not working?

查看:123
本文介绍了在SKScene的应用程序购买无法正常工作?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在Swift中创建一个SpriteKit游戏,我正试图在应用程序购买中实现。



我在这里关注了这个问题: in在SKScene购买应用程序



这是我的代码:



在didMoveToView中:

  //设置IAPS 
if(SKPaymentQueue.canMakePayments()){
println(IAP已启用,正在加载)
var productID:NSSet = NSSet(objects:GameOverSaveSavior)
var request:SKProductsRequest = SKProductsRequest(productIdentifiers:productID as Set< NSObject>)
request.delegate = self
request.start()
} else {
println(请启用IAPS)
}

在didMoveToView之外,但在 GameScene

  // IN APP PURCHASE ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ) 
var p = SKProduct()

func purchaseMade(){
println(他们买了!)
}

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

var pay = SKPayment(product:p)
SKPaymentQueue.defaultQueue()。addTransactionObserver(self)
SKPaymentQueue.defaultQueue()。addPayment(支付为SKPayment)
}
func productsRequest(请求:SKProductsRequest!,didReceiveResponse响应:SKProductsResponse!){
println(product request)
var myProduct = response.products

myProduct中的产品{
println(product added)
println(product.productIdentifier)
println( product.localizedTitle)
println(product.localizedDescription)
println(product.price)

productList.append(产品为! SKProduct)
}
}

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

var buyingItemIDS = []
for queue.transactions中的事务{
var t:SKPaymentTransaction = transaction as! SKPaymentTransaction

让prodID = t.payment.productIdentifier as String

switch prodID {
caseGameOverSaveSavior:

purchaseMade()

//这里就是你在应用内购买完成时应该放置你想要执行的功能的地方
默认值:
println(IAP not setup)
}

}

var alert = UIAlertView(标题:谢谢,消息:您的购买已恢复。您可能需要重启删除横幅广告之前的应用。,delegate:nil,cancelButtonTitle:OK)
alert.show()
}


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

for transaction:事务中的AnyObject {
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 {
caseGameOverSaveSavior:

//这里你应该在购买完成后放置你想要执行的功能
var alert = UIAlertView(标题:谢谢你,消息:你可能需要在横幅之前重启应用程序广告被删除。,委托:nil,cancelButton标题:确定)
alert.show()
默认值:
println(IAP未设置)
}

queue.finishTransaction(trans)
break;
case.Failed:
println(买错误)
queue.finishTransaction(trans)
break;
默认值:
println(默认)
break;

}
}
}

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

// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ b $被触及:

  //在app中购买
if touchingNode == saveMeBtn {

println(按钮触摸!)
for productList中的产品{
var prodID = product.productIdentifier
if(prodID ==GameOverSaveSavior){
p = product
buyProduct()//这是我们之前添加的函数之一
break;
}
}

我的所有代码都直接来自上述问题,并且代码编译没有任何错误和


启用IAP,加载



产品请求


在游戏开始时打印到控制台。



触摸应用程序内购买按钮时,


按钮被触摸!


打印到控制台但没有其他事情发生。它不会要求用户购买任何东西。



我确保Xcode中的捆绑包ID与iTunes Connect中的相同,并且应用程序内购买ID是相同的。我在这里做错了什么?

解决方案

经过几周的工作,我发现你必须拥有付费应用程序协议已完全填写并被接受,以便您的代码和产品能够正常运行。批准可能需要几天,然后你就明白了。


I'm creating a SpriteKit game in Swift and I'm trying to implement in app purchases.

I followed this question here: in app purchase in SKScene

And here is my code:

In didMoveToView:

 // 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")
        }

Outside of didMoveToView but in GameScene:

 //IN APP PURCHASE ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    var productList = [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)

            productList.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");
    }

 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

In touchesBegan for when the in app purchase node is touched:

//In app purchase
            if touchedNode == saveMeBtn {

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

All of my code is straight from the question above, and the code compiles without any errors and

IAP is enabled, loading

and

product request

is printed to the console at the start of the game.

When the in app purchase button is touched,

button touched!

is printed to the console but nothing else happens. It doesn't ask the user to purchase anything.

I made sure that the bundle ID in Xcode is the same as in iTunes Connect and that the in app purchase ID is the same. What am I doing wrong here?

解决方案

After a good few weeks of work, I found out that you must have your Paid Applications agreement filled out completely and accepted in order for your code and products to work. Approval can take a few days, then you're in the clear.

这篇关于在SKScene的应用程序购买无法正常工作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆