恢复购买工作,但它不断循环 [英] Restore Purchase working but it is looping constantly

查看:112
本文介绍了恢复购买工作,但它不断循环的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用Swift在iOS中实现In App Purchase,但还原购买功能给出了问题。每当我点击恢复购买按钮时它工作正常,但它会不断添加到队列中。请帮忙。

I'm trying to implement In App Purchase in iOS using Swift, but the Restore Purchase functionality is giving problem. Whenever I click on the restore purchase button it is working fine but it keeps adding it to the queue. Please Help.

以下是我的代码和输出。

Below is my code and output.

在输出中IAP not setup method3继续增加每当我点击恢复购买按钮时。

In the output "IAP not setup method3" keeps on increasing by one whenever I click on Restore Purchase button.

import UIKit
import StoreKit

class PremiumUpgradeVC: UIViewController , SKProductsRequestDelegate, SKPaymentTransactionObserver{
    @IBOutlet weak var uiScrollVw: UIScrollView!
    @IBOutlet weak var btnPremiumPurchase: UIButton!    
    @IBOutlet weak var btnPrice: UIButton!   
    @IBOutlet weak var btnRestorePur: UIButton!    
    var removeAds : Bool = false
    var enableCompilations : Bool = false
    var premiumPurchasedKey : String = "isPremiumPurchased"
    var list = [SKProduct]()
    var p = SKProduct()
    var IAPId = "com.creativecub.testme"

    override func viewDidLoad() {
        super.viewDidLoad()       

        if(SKPaymentQueue.canMakePayments()){
            print("IAP is enabled, loading")
            var productID:NSSet = NSSet(objects: IAPId)
            var request :SKProductsRequest = SKProductsRequest(productIdentifiers : productID as! Set<String>)
            request.delegate = self
            request.start()
            //loadingAlert.

        }else{
            print("please enable IAP")            
        }        
    }

    @IBAction func actionGoPremium(sender: UIButton) {    
        print("on action button")
        for product in list{
            var prodID = product.productIdentifier
            if(prodID == IAPId){
                p = product
                buyProduct()
                break;                
            }
        }
    }

    func goPremi(){
        print("in method : gopremium")
      //  removeAds = true
      //  enableCompilations = true
        HelperClass.setValSharedPerf(premiumPurchasedKey, value: "true")
        print("ads removed and compilations enables .. Enjoy")        
    }

    @IBAction func actionRestorePurchase(sender: UIButton) {
        print("in method : 1")
        SKPaymentQueue.defaultQueue().addTransactionObserver(self)        SKPaymentQueue.defaultQueue().restoreCompletedTransactions()        
    }

    func buyProduct() {        
        print("buy product -" + p.productIdentifier)
        let pay = SKPayment(product: p)
        SKPaymentQueue.defaultQueue().addTransactionObserver(self)
        SKPaymentQueue.defaultQueue().addPayment(pay as SKPayment)
        print("in method : 2")
    }

    //restored transaction function
      func paymentQueueRestoreCompletedTransactionsFinished(queue: SKPaymentQueue) {
        print("in method : 3")
        //print("transaction retsored")
        var purchasedItemIDs = []
        for transaction in queue.transactions{
            let t: SKPaymentTransaction = transaction
            let prodID = t.payment.productIdentifier as String
                      switch prodID {
            case IAPId:
                print("premium Upgrade method 3")
                goPremi()                      
             SKPaymentQueue.defaultQueue().finishTransaction(transaction as SKPaymentTransaction)

            default:
                print("IAP not setup method3") // this keeps increasing
            }
        }      
    }

    func productsRequest(request: SKProductsRequest, didReceiveResponse response: SKProductsResponse) {
        print("in method : 4")
        print("product request")
        var myProducts = response.products
        for product in myProducts {            
            print("product added - details :" + product.productIdentifier + product.localizedTitle)            
            let price = priceStringForProduct(product)
            btnPrice.setTitle("Buy for: "+price!, forState: UIControlState.Normal)

            list.append(product)
        }        
    }    

    //restore purchase
    func paymentQueue(queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
       // print("added payment")
        print("in method : 5")
        for transaction:AnyObject in transactions{
            let trans = transaction as! SKPaymentTransaction
            //print(trans.error)

            switch trans.transactionState {
            case .Purchased:  //switch1 case 1 
                print("buy ok, unlock IAP here")              

                let prodID = p.productIdentifier as String              
                switch prodID {
                case IAPId:
                    print("premium Upgrade .. purchase restored")
                    goPremi()
                    queue.finishTransaction(trans)

                default:
                    print("IAP not setup method5")
                }

                queue.finishTransaction(trans)
                break;

            case .Failed: //switch1 case 2
                print("error in buy")
                queue.finishTransaction(trans)
                break;


            default: //switch1 case 3
                print("default case method 5")               
                break;            
            }
        }
    }

    func finishTransaction(trans:SKPaymentTransaction){
        print("finsh trans")
        SKPaymentQueue.defaultQueue().finishTransaction(trans)
        print("in method : 6")
    }

    func paymentQueue(queue: SKPaymentQueue, removedTransactions transactions: [SKPaymentTransaction]) {
        print("remove trnas")
        SKPaymentQueue.defaultQueue().removeTransactionObserver(self)
        print("in method : 7")
    }

    func priceStringForProduct(item: SKProduct) -> String? {        
        let numberFormatter = NSNumberFormatter()
        let price = item.price
        let locale = item.priceLocale
        numberFormatter.numberStyle = .CurrencyStyle
        numberFormatter.locale = locale
        return numberFormatter.stringFromNumber(price)
    }

    func goBack()
    {
        self.dismissViewControllerAnimated(true, completion: nil);
    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    override func viewWillDisappear(animated: Bool) {
        SKPaymentQueue.defaultQueue().removeTransactionObserver(self)
        print("disapeard")
    }
    }

这是输出:

in method : 1

in method : 5

default case method 5

default case method 5

in method : 3

IAP not setup method3 //this statement keep increasing on button click

IAP not setup method3

IAP not setup method3

IAP not setup method3

IAP not setup method3

premium Upgrade method 3

in method : gopremium

ads removed and compilations enables .. Enjoy

remove trnas

in method : 7


推荐答案

你不应该在paymentQueueRestoreCompletedTransactionsFinished做任何事情除了更新你的用户界面,如果需要。调用此委托方法以指示恢复过程已完成;仅此而已。

You should not do anything in paymentQueueRestoreCompletedTransactionsFinished aside from updating your UI if required. This delegate method is called to indicate that the restoration process is complete; nothing more.

已恢复的交易将以已恢复的状态传递给您更新的交易方法。您应该像处理购买状态一样处理它们

The restored transactions will be delivered to your updated transactions method with a state of restored. You should process them the same as you do with the state of purchased

这篇关于恢复购买工作,但它不断循环的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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