我的 IAP 无法正常工作。 func Paymentqueue 中的错误

Posted

技术标签:

【中文标题】我的 IAP 无法正常工作。 func Paymentqueue 中的错误【英文标题】:My IAP isn't working. Bugs at func Paymentqueue 【发布时间】:2015-11-16 17:53:37 【问题描述】:

当我点击我的任何一个 IAPS 时,会出现一条消息,指出 IAP 已购买(事实并非如此)并将免费恢复,然后什么都没有发生,IAP 不会执行。

这是我在控制台中得到的:

No Value.
IAP is enabled, loading...

true
Product Request
Product Added
IAP id
Remove Ads
Removes ads from the app.
2
Buy: IAP id
Add Payment
nil
default: Error

这是我的代码:

GameViewController.Swift

import UIKit
import StoreKit


class GameViewController: UIViewController, ADBannerViewDelegate, SKProductsRequestDelegate, SKPaymentTransactionObserver, GKGameCenterControllerDelegate,GADBannerViewDelegate


    @IBOutlet var outRemoveAds: UIButton!
    @IBOutlet var outRestorePurchases: UIButton!


    override func viewDidLoad() 
        super.viewDidLoad()
    

    override func viewWillAppear(animated: Bool) 
        super.viewWillAppear(animated)

        if NSUserDefaults.standardUserDefaults().objectForKey("val") != nil 
            print("Has a value.")
            banner.removeFromSuperview()
            bannerGoogle.removeFromSuperview()
            outRemoveAds.removeFromSuperview()
            outRestorePurchases.removeFromSuperview()
            removeInterFrom = 1
        
        else 
            print("No Value.")
        

        if(SKPaymentQueue.canMakePayments())
            print("IAP is enabled, loading...")
            let productID:NSSet = NSSet(objects:"IAP id")
            let request: SKProductsRequest = SKProductsRequest(productIdentifiers: productID as! Set<String>)
            request.delegate = self
            request.start()
        
        else
            print("Please enable IAPS")

        

    


    //IAP Ads

    @IBAction func removeAds(sender: UIButton) 
        for product in list
            let prodID = product.productIdentifier
            if (prodID == "IAP id")
                p = product
                buyProduct()
                break
            
        
    
    @IBAction func restorePurchases(sender: UIButton) 
        SKPaymentQueue.defaultQueue().addTransactionObserver(self)
        SKPaymentQueue.defaultQueue().restoreCompletedTransactions()
    


    //IAP Functions

    var list = [SKProduct]()
    var p = SKProduct()

    func removeAds()
        banner.removeFromSuperview()
        bannerGoogle.removeFromSuperview()
        outRemoveAds.removeFromSuperview()
        outRestorePurchases.removeFromSuperview()
        let theValue = 10
        NSUserDefaults.standardUserDefaults().setObject(theValue, forKey: "val")
        NSUserDefaults.standardUserDefaults().synchronize()
    

    func buyProduct()
        print("Buy: "+p.productIdentifier)
        let pay = SKPayment (product: p)
        SKPaymentQueue.defaultQueue().addTransactionObserver(self)
        SKPaymentQueue.defaultQueue().addPayment(pay as SKPayment)
    

    func productsRequest(request: SKProductsRequest, didReceiveResponse response: SKProductsResponse) 
        print("Product Request")
        let myProduct = response.products

        for product in myProduct
            print("Product Added")
            print(product.productIdentifier)
            print(product.localizedTitle)
            print(product.localizedDescription)
            print(product.price)

            list.append(product as SKProduct)
        
    

    func paymentQueue(queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) 
        print("Add Payment")

        for transaction:AnyObject in transactions
            let trans = transaction as! SKPaymentTransaction
            print(trans.error)
            switch trans.transactionState
            case .Purchased:
                print("IAP unlocked")
                print(p.productIdentifier)

                let prodID = p.productIdentifier as String
                switch prodID
                case "IAP id":
                    print("Remove Ads")
                    removeAds()
                default:
                    print("IAP not setup")
                
                queue.finishTransaction(trans)
                break
            case .Failed:
                print ("Buy error")
                queue.finishTransaction(trans)
                break
            default:
                print("default: Error")
                break
            
        
    

    func paymentQueueRestoreCompletedTransactionsFinished(queue: SKPaymentQueue) 
        print("Purchases Restored")

        _ = []
        for transaction in queue.transactions 
            let t: SKPaymentTransaction = transaction as SKPaymentTransaction

            let prodID = t.payment.productIdentifier as String
            switch prodID
            case "IAP id":
                print("Remove Ads")
                removeAds()
            default:
                print("IAP not setup")
            


        
    
    func finishTransaction(trans:SKPaymentTransaction)
        print("Finshed Transaction")
    

    func paymentQueue(queue: SKPaymentQueue, removedTransactions transactions: [SKPaymentTransaction]) 
        print("Remove Transaction")
    

MenuViewController.swift

import UIKit
import StoreKit
import Social




class MenuViewController: UIViewController, SKProductsRequestDelegate,SKPaymentTransactionObserver 

    @IBOutlet var outRestart: UIButton!
    @IBOutlet var outBuy: UIButton!



    override func viewDidLoad() 
        super.viewDidLoad()

    

    override func viewWillAppear(animated: Bool) 
        super.viewWillAppear(animated)


        if(SKPaymentQueue.canMakePayments())
            print("IAP is enabled, loading...")
            let productID:NSSet = NSSet(objects:"IAP id")
            let request: SKProductsRequest = SKProductsRequest(productIdentifiers: productID as! Set<String>)
            request.delegate = self
            request.start()
        
        else
            print("Please enable IAPS")

        

    


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

    @IBAction func buy(sender: UIButton) 
        for product in list
            let prodID = product.productIdentifier
            if (prodID == "IAP id")
                p = product
                buyProduct()
                break
            
        

    

    //IAP Functions

    var list = [SKProduct]()
    var p = SKProduct()

    func keepOn()
        buyornot = 1
        Back()
    

    func buyProduct()
        print("Buy: "+p.productIdentifier)
        let pay = SKPayment (product: p)
        SKPaymentQueue.defaultQueue().addTransactionObserver(self)
        SKPaymentQueue.defaultQueue().addPayment(pay as SKPayment)
    

    func productsRequest(request: SKProductsRequest, didReceiveResponse response: SKProductsResponse) 
        print("Product Request")
        let myProduct = response.products

        for product in myProduct
            print("Product Added")
            print(product.productIdentifier)
            print(product.localizedTitle)
            print(product.localizedDescription)
            print(product.price)

            list.append(product as SKProduct)
        
    

    func paymentQueue(queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) 
        print("Add Payment")

        for transaction:AnyObject in transactions
            let trans = transaction as! SKPaymentTransaction
            print(trans.error)
            switch trans.transactionState
            case .Purchased:
                print("IAP unlocked")
                print(p.productIdentifier)

                let prodID = p.productIdentifier as String
                switch prodID
                case "IAP id":
                    print("Keep on")
                    keepOn()
                default:
                    print("IAP not setup")
                
                queue.finishTransaction(trans)
                break
            case .Failed:
                print ("Buy error")
                queue.finishTransaction(trans)
                break
            default:
                print("default: Error")
                break
            
        
    

    func finishTransaction(trans:SKPaymentTransaction)
        print("Finshed Transaction")
    

    func paymentQueue(queue: SKPaymentQueue, removedTransactions transactions: [SKPaymentTransaction]) 
        print("Remove Transaction")
    

【问题讨论】:

【参考方案1】:

我找到了解决办法!

删除

SKPaymentQueue.defaultQueue().addTransactionObserver(self) 

在您拥有它的任何地方,并将其放置一次(仅一次)在每次应用启动时都会执行的位置(我将其放在 viewDidLoad() 中)。

这将检查所有未完成的交易并在应用加载后终止它们,从而在您的用户触发 IAP 之前消除任何可能的错误。

(如果这个答案或这个问题对你有帮助,别忘了点赞;))

P.S.:另外,这不是我的问题,但请确保为每个 PurchaseState 完成事务处理(),如下所示:

func paymentQueue(queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) 
        print("Add Payment")

        for transaction:AnyObject in transactions
            let trans = transaction as! SKPaymentTransaction
            print(trans.error)
            switch trans.transactionState
            case .Purchased:
                print("IAP unlocked")
                print(p.productIdentifier)

                let prodID = p.productIdentifier as String
                switch prodID
                case "IAP id":
                    print("Keep on")
                    keepOn()
                default:
                    print("IAP not setup")
                
                queue.finishTransaction(trans)
                break
            case .Failed:
                print ("Buy error")
                queue.finishTransaction(trans)
                break
            default:
                print("default: Error")
                break
            
        
    

永远不要忘记这一点:

 queue.finishTransaction(trans)  

【讨论】:

以上是关于我的 IAP 无法正常工作。 func Paymentqueue 中的错误的主要内容,如果未能解决你的问题,请参考以下文章

如果有托管内容,IAP 会失败,但如果被视为正常的非消耗品,则可以正常工作

Swift IOS 13,IAP - “无法连接到 Itunes Connect”

React Native:按钮onPress无法正常工作

iOS 中的 IAP 停止工作

尝试所有这些步骤后,“应用内购买”仍然无法正常工作

IAP 正在使用 TestFlight 构建。它也可以使用 Live 应用程序吗?