Aaliya
Aaliya

Reputation: 85

Restore Purchase working but it is looping constantly

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.

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

This is the output:

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

Upvotes: 0

Views: 143

Answers (1)

Paulw11
Paulw11

Reputation: 114826

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

Upvotes: 1

Related Questions