in app purchase in SKScene
Asked Answered
C

1

8

Is it possible to implement an in-app purchase within the SKScene? If so, how? I'm trying to use a SKSpriteNode as a 'buy' button with no luck. I'm not sure whether the code needs to go in the SKScene or the view controller. I've looked at loads of tutorials, but they all seem to be aimed at single view applications rather than in SpriteKit.

Campus answered 9/8, 2015 at 17:40 Comment(0)
N
6

First, put this in your game scene line and make sure you have the framework 'StoreKit' imported

class GameScene: SKScene, SKPaymentTransactionObserver, SKProductsRequestDelegate {

Next, your going to want to put these lines in your didmovetoview. Keep in mind that after the "objects:" The string you put should be the in app purchase identifier you set up using iTunes connect.

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

Outside of any other functions, but still within the game scene, insert these functions and variables

//In App Purchases
var list = [SKProduct]()
var p = SKProduct()

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 "IAP id here":

            //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 "IAP id here":

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

Next you must name the node you need to do the iAP

whateverYourNodeIs.name = "inAppPurchaseNode"

Finally, do this in the touchesBegan

  let touch =  touches.first as? UITouch
  let positionInScene = touch!.locationInNode(self)
  let touchedNode = self.nodeAtPoint(positionInScene)

if let name = touchedNode.name {
        if name == "inAppPurchaseNode" {

                for product in list {
                    var prodID = product.productIdentifier
                    if(prodID == "iAp id here") {
                        p = product
                        buyProduct()  //This is one of the functions we added earlier
                        break;
                    }
                }
            }

    }

You will also want this in your touches began to restore the purchases using a different node.

    if let name = touchedNode.name {
        if name == "restore" {

             SKPaymentQueue.defaultQueue().restoreCompletedTransactions()
            SKPaymentQueue.defaultQueue().addTransactionObserver(self)
             }
        }
Nijinsky answered 10/8, 2015 at 2:41 Comment(3)
Wherever I put the string "iAP id here" I mean that you must use the in app purchase id you made in iTunes connectNijinsky
Thankyou so much for your help, I've looked everywhere for an answer like this!! :) :)Campus
You are very welcome. Also, I noticed I left some UIAlertViews in the code from a game I made a while ago. You can delete those or just change the text if you want.Nijinsky

© 2022 - 2024 — McMap. All rights reserved.