2016-10-10 21 views
0

我試圖在iOS中使用Swift實現應用內購買,但恢復購買功能給出了問題。每當我點擊還原購買按鈕時,它工作正常,但它不斷將其添加到隊列中。請幫忙。恢復購買工作,但它不斷循環

下面是我的代碼和輸出。

在輸出「IAP not setup method3」時,只要點擊「恢復購買」按鈕,它就會持續增加一次。

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 
+0

除了根據需要更新UI之外,您不應在'paymentQueueRestoreCompletedTransactionsFinished'中執行任何操作。恢復的交易將以恢復狀態交付給您更新的交易方法。您應該像處理購買狀態一樣處理它們。 – Paulw11

+0

Hi @Bryan,謝謝它爲我工作。發表您的評論作爲答覆,我會投票:) – Aaliya

+0

我認爲你的意思是@ Paulw11 – Bryan

回答

1

你不應該在paymentQueueRestoreCompletedTransactionsFinished從如果需要更新您的UI做任何事情放在一邊。調用此委託方法以指示恢復過程已完成;而已。

恢復的交易將以恢復狀態交付給更新的交易方法。您應該像處理購買狀態一樣處理它們