2016-10-10 4 views
0

Ich versuche, In App Purchase in iOS mit Swift zu implementieren, aber die Restore Purchase-Funktion gibt Probleme. Immer wenn ich auf den Wiederherstellungskaufknopf klicke, funktioniert es gut, aber es fügt es der Warteschlange hinzu. Bitte Hilfe.Wiederherstellen Kauf funktioniert, aber es ist ständig Looping

Unten ist mein Code und Ausgabe.

In der Ausgabe "IAP not setup method3" erhöht sich immer um eins, wenn ich auf die Schaltfläche Restore Purchase klicke.

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

Dies ist die Ausgabe:

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

Sie sollten nichts tun in 'paymentQueueRestoreCompletedTransactionsFinished 'neben der Aktualisierung Ihrer Benutzeroberfläche, falls erforderlich. Die wiederhergestellten Transaktionen werden an Ihre aktualisierte Transaktionsmethode mit dem Status Wiederhergestellt zugestellt. Sie sollten sie genauso wie Sie mit dem Zustand der gekauften – Paulw11

+0

Hi @Bryan verarbeiten, danke, dass es für mich arbeitete. poste deinen Kommentar als Antwort, ich werde abstimmen :) – Aaliya

+0

Ich denke du meintest @ Paulw11 – Bryan

Antwort

1

Sie nicht, wenn erforderlich, von der Aktualisierung Ihrer Benutzeroberfläche etwas in paymentQueueRestoreCompletedTransactionsFinished beiseite tun sollten. Diese Delegate-Methode wird aufgerufen, um anzugeben, dass der Wiederherstellungsprozess abgeschlossen ist. nichts mehr.

Die wiederhergestellten Transaktionen werden an Ihre aktualisierte Transaktionsmethode mit dem Status Wiederhergestellt zugestellt. Sie sollten sie genauso wie Sie mit dem Zustand der gekauften bearbeiten

Verwandte Themen