ios - 恢复购买工作,但它不断循环

标签 ios swift in-app-purchase

我正在尝试使用 Swift 在 iOS 中实现 In App Purchase,但恢复购买功能出现问题。每当我点击恢复购买按钮时,它都工作正常,但它一直将其添加到队列中。请帮忙。

下面是我的代码和输出。

每当我点击“恢复购买”按钮时,输出“IAP not setup method3”一直增加 1。

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

最佳答案

除了在需要时更新 UI 之外,您不应在 paymentQueueRestoreCompletedTransactionsFinished 中执行任何操作。调用此委托(delegate)方法表示恢复过程已完成;仅此而已。

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

关于ios - 恢复购买工作,但它不断循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39958491/

相关文章:

ios - Xamarin Forms 可以针对 iOS 通用应用程序吗?

ios - 多个子项目构建为一个 pod 下的模块

ios - 核心数据查询值 "is not nil"未返回值等于 0 的对象

iOS StoreKit 应用程序(应用程序内购买应用程序)- 互联网不可用时

ios - 如何在 CallKit 中使用 CXStartCallAction isVideo 属性和原生视频按钮?

ios - NSPredicate ANY 多列

ios - Twilio Remote view(TV VideoView)在接收端是空白的

Swift - 是什么决定了字典集合的顺序?

xcode - 内购 : Restoring a purchase no longer for sale

iphone - iPhone 中的应用内购买