Ios 如何在Swift Spritekit中添加多个应用内购买?

Ios 如何在Swift Spritekit中添加多个应用内购买?,ios,swift,in-app-purchase,Ios,Swift,In App Purchase,我有这个应用内购买解锁2级,它可以工作,但我如何添加另一个应用内购买解锁3级?我是否必须创建新函数并添加level3的代码?我不知道怎么做。谢谢 func unlockLevel() { if SKPaymentQueue.canMakePayments() { var productID:NSSet = NSSet(object: "unlockLevelTwo") var productsRequest:SKProductsRequest =

我有这个应用内购买解锁2级,它可以工作,但我如何添加另一个应用内购买解锁3级?我是否必须创建新函数并添加level3的代码?我不知道怎么做。谢谢

    func unlockLevel() {
    if SKPaymentQueue.canMakePayments() {
        var productID:NSSet = NSSet(object: "unlockLevelTwo")
        var productsRequest:SKProductsRequest = SKProductsRequest(productIdentifiers: productID as Set<NSObject>)
        productsRequest.delegate = self
        productsRequest.start()
        println("Fetching products...")
    }
    else {
        println("Can't make purchases")
    }
}

func buyProduct(product: SKProduct) {
    println("Sending the Payment Request to Apple");
    var payment = SKPayment(product: product)
    SKPaymentQueue.defaultQueue().addPayment(payment);
}

func productsRequest(request: SKProductsRequest!, didReceiveResponse response: SKProductsResponse!) {
    var count : Int = response.products.count
    if (count>0) {
        var validProducts = response.products
        var validProduct: SKProduct = response.products[0] as! SKProduct
        if (validProduct.productIdentifier == "unlockLevelTwo") {
            println(validProduct.localizedTitle)
            println(validProduct.localizedDescription)
            println(validProduct.price)
            buyProduct(validProduct);
        }
        else {
            println(validProduct.productIdentifier)
        }
    }
    else {
        println("nothing")
    }
}

func request(request: SKRequest!, didFailWithError error: NSError!) {
    println("Error fetching product info")
}

func RestorePurchases() {
    SKPaymentQueue.defaultQueue().restoreCompletedTransactions()


}

func paymentQueueRestoreCompletedTransactionsFinished(queue: SKPaymentQueue!) {

    for item in queue.transactions {
        if let transaction = item as? SKPaymentTransaction {
            if transaction.transactionState == .Restored {
                unlockLevel()
                SKPaymentQueue.defaultQueue().finishTransaction(transaction)
                break
            }
        }
    }
    if queue.transactions.count == 0 {
        println("not restored")
        displayRestoreAlert()
    }
}

func displayRestoreAlert() {

    let alertController = UIAlertController(title: "Level Two has not been purchased on this account.", message: nil, preferredStyle: .Alert)
    let OKAction = UIAlertAction(title: "OK", style: .Default, handler: nil)
    alertController.addAction(OKAction)
    self.viewController.presentViewController(alertController, animated: true, completion: nil)

}



func paymentQueue(queue: SKPaymentQueue!, updatedTransactions transactions: [AnyObject]!) {
    println("Received Payment Transaction Response from Apple");

    for transaction:AnyObject in transactions {
        if let trans:SKPaymentTransaction = transaction as? SKPaymentTransaction{
            switch trans.transactionState {
            case .Purchased:
                println("Product Purchased");
                SKPaymentQueue.defaultQueue().finishTransaction(transaction as! SKPaymentTransaction)
                NSUserDefaults().setBool(true, forKey: "Leavel2")
                unlockLevelTwo()
                break;
            case .Failed:
                println("Purchased Failed");
                SKPaymentQueue.defaultQueue().finishTransaction(transaction as! SKPaymentTransaction)
                break;
            case .Restored:
                println("Already Purchased");
                SKPaymentQueue.defaultQueue().restoreCompletedTransactions()

            default:
                break;
            }
        }
    }
}
func解锁级别(){
如果SKPaymentQueue.canMakePayments(){
var productID:NSSet=NSSet(对象:“unlockLevelTwo”)
var PRODUCTSRESQUEST:SKPRODUCTSRESQUEST=SKPRODUCTSRESQUEST(产品标识符:设置的产品ID)
productsRequest.delegate=self
productsRequest.start()
println(“获取产品…”)
}
否则{
println(“无法购买”)
}
}
func buyProduct(产品:SKProduct){
println(“向苹果发送付款请求”);
var付款=SKPayment(产品:产品)
SKPaymentQueue.defaultQueue().addPayment(付款);
}
func productsRequest(请求:SKProductsRequest!,DID接收方响应:SKProductsResponse!){
变量计数:Int=response.products.count
如果(计数>0){
var validProducts=response.products
var validProduct:SKProduct=response.products[0]为!SKProduct
if(validProduct.productIdentifier==“unlockLevelTwo”){
println(validProduct.localizedTitle)
println(有效产品本地化描述)
println(有效产品价格)
购买产品(有效产品);
}
否则{
println(validProduct.productIdentifier)
}
}
否则{
println(“无”)
}
}
func请求(请求:SKRequest!,错误:NSError!){
println(“获取产品信息时出错”)
}
func restorepources(){
SKPaymentQueue.defaultQueue().restoreCompletedTransactions()
}
func paymentQueueRestoreCompletedTransactionsFinished(队列:SKPaymentQueue!){
对于queue.transactions中的项目{
如果let transaction=项目as?SKPaymentTransaction{
如果transaction.transactionState==.Restored{
解锁级别()
SKPaymentQueue.defaultQueue().finishTransaction(事务)
打破
}
}
}
如果queue.transactions.count==0{
println(“未恢复”)
displayRestoreAlert()
}
}
func displayRestoreAlert(){
让alertController=UIAlertController(标题:“未在此帐户上购买二级”。消息:nil,preferredStyle:.Alert)
让OKAction=UIAlertAction(标题:“确定”,样式:。默认,处理程序:nil)
alertController.addAction(OKAction)
self.viewController.presentViewController(alertController,动画:true,完成:nil)
}
func paymentQueue(队列:SKPaymentQueue!,更新的交易:[AnyObject]!){
println(“收到苹果公司的付款交易响应”);
对于事务:事务中的任何对象{
如果让交易:SKPaymentTransaction=交易为?SKPaymentTransaction{
开关trans.transactionState{
案例。购买:
println(“购买的产品”);
SKPaymentQueue.defaultQueue().finishTransaction(事务为!SKPaymentTransaction)
NSUserDefaults().setBool(true,forKey:“level2”)
解锁leveltwo()
打破
案例。失败:
println(“购买失败”);
SKPaymentQueue.defaultQueue().finishTransaction(事务为!SKPaymentTransaction)
打破
案件.恢复:
println(“已购买”);
SKPaymentQueue.defaultQueue().restoreCompletedTransactions()
违约:
打破
}
}
}
}

这个问题相当广泛。从概念上讲,每个关卡都是一个“产品”。您需要注册多个产品,然后在游戏逻辑中检查哪些产品已经购买。这在编程指南中有介绍-具体地看一下有关检索产品信息和交付产品的章节。还可以看看StoreKit(不是SpriteKit)API参考(URL太长)。我已经为它制作了第二个产品。我只是不知道是否要再次复制代码,或者我可以在op中使用相同的代码并将3级代码放入其中。我发布的代码是解锁2级代码,它可以工作。如何使用相同的代码解锁级别3?我将使用另一种叫做unlockLevelThree的产品。有可能吗?有人能帮我吗?如果你不明白我说什么或需要更多的代码,让我知道。感谢您在
支付队列
函数中循环处理
交易
。每个交易对象都有一个
payment
属性,该属性为您提供
SKPayment
。这又具有
productIdentifier
属性,该属性来自您的
SKProduct
。这是你的“unlockLevelWhatever”字符串。您可以使用它来决定在您购买的案例中永久存储哪些商店。注意:存储在UserPrefs中是不安全的(用户可以在不执行购买的情况下对此进行更改)。在某些地方,您还将“Level”拼写为“Level”,如果您的拼写不一致,可能会导致错误。这个答案对你有用吗?这个问题相当广泛。从概念上讲,每个关卡都是一个“产品”。您需要注册多个产品,然后在游戏逻辑中检查哪些产品已经购买。这在编程指南中有介绍-具体地看一下有关检索产品信息和交付产品的章节。还可以看看StoreKit(不是SpriteKit)API参考(URL太长)。我已经为它制作了第二个产品。我只是不知道是否要再次复制代码,或者我可以在op中使用相同的代码并将3级代码放入其中。我发布的代码是解锁2级代码,它可以工作。如何使用相同的代码解锁级别3?我将使用另一种叫做unlockLevelThree的产品。有可能吗?可以吗