【问题标题】:In-app purchase bug, not working properly应用内购买错误,无法正常工作
【发布时间】:2020-03-30 14:31:41
【问题描述】:

我正在尝试在我的应用中实现应用内购买,但它并没有按照我想要的方式工作。我只是运行一个测试,结果是当我按下upgradeButton 时,我被要求输入我的密码(它说这是沙盒模式)。当我按下 OK 并等待几秒钟时,它表示我已经购买了这个,并且将免费获得它。然后当我按下 OK 按钮时,什么也没有发生。 upgradeLabel 只是说PLEASE WAIT... 甚至没有显示来自unlockProFeaturesYAY 日志,所以看起来unlockProFeatures 没有运行。

请帮忙。有谁知道出了什么问题?这里有我完整的InfoViewController.swift 代码:

import UIKit
import StoreKit

class InfoViewController: UIViewController, SKPaymentTransactionObserver, SKProductsRequestDelegate {

    var pro = UserDefaults.standard.bool(forKey: "isUpgraded")

    @IBOutlet var upgradeLabel: UILabel!
    @IBOutlet var upgradeButton: UIButton!

    @IBOutlet var restorebutton: UIButton!

    var productID = "com.myID.Upgrade"
    var productsRequest:SKProductsRequest = SKProductsRequest()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Setup UIView:

        if pro {
            upgradeButton.isEnabled = false
            restorebutton.isHidden = true
            upgradeLabel.text = NSLocalizedString("SUBSCRIPTION: PREMIUM", comment: "")

        } else {
            upgradeButton.isEnabled = true
            upgradeLabel.text = NSLocalizedString("UPGRADE TO PREMIUM", comment: "")

            // In App Purchase:
            print("IAP: Loading...")
            upgradeButton.isEnabled = false

            self.configureIAP()
        }
    }

    @IBAction func upgradeButtonAction(_ sender: Any) { // Purchase button
        print("Upgrade button tapped")

        upgradeButton.isEnabled = false

        if SKPaymentQueue.canMakePayments() {
            print("canMakePayments")

            SKPaymentQueue.default().add(self)

            let paymentRequest = SKMutablePayment()
            paymentRequest.productIdentifier = productID
            SKPaymentQueue.default().add(paymentRequest)

            upgradeButton.isEnabled = false
            upgradeLabel.text = NSLocalizedString("PLEASE WAIT...", comment: "")
        } else {
            print("User unable to make payments")
            upgradeButton.isEnabled = true
        }
    }

    @IBAction func restoreButton(_ sender: Any) {
        print("Restore")

        SKPaymentQueue.default().restoreCompletedTransactions()
    }

    func configureIAP() {

        // Set IAPS
        if(SKPaymentQueue.canMakePayments()) {
            print("IAP is enabled, loading")

            let productIDSet:NSSet = NSSet(objects: "com.myID.Upgrade")
            productsRequest = SKProductsRequest(productIdentifiers: productIDSet as! Set<String>)
            productsRequest.delegate = self
            productsRequest.start()

            upgradeButton.isEnabled = true
        } else {
            print("please enable IAPS")
        }

    }

    func productsRequest(_ request: SKProductsRequest, didReceive 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)
            //println(product.price)

            //list.append(product )

            DispatchQueue.main.async {
                self.upgradeButton.isEnabled = true
            }
            print("Upgrade now! (" + product.localizedPrice() + ")")
        }
    }

    func paymentQueue(_ queue: SKPaymentQueue, removedTransactions transactions: [SKPaymentTransaction]) {
        print("REMOVED")
    }

    func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
        for transaction in transactions {
            if transaction.transactionState == .purchased {
                //if item has been purchased
                print("Transaction Successful")
                creditsLabel.text = "Purchase Completed!"
                self.unlockProFeatures()
            } else if transaction.transactionState == .failed {
                print("Transaction Failed: \(String(describing: transaction.error))")
                upgradeButton.isEnabled = true
                upgradeLabel.text = NSLocalizedString("UPGRADE TO PREMIUM", comment: "")

                // create the alert
                let alert = UIAlertController(title: nil, message: transaction.error?.localizedDescription, preferredStyle: UIAlertController.Style.alert)
                alert.addAction(UIAlertAction(title: "OK", style: UIAlertAction.Style.default, handler: nil))
                self.present(alert, animated: true, completion: nil)

            } else if transaction.transactionState == .restored {
                print("Transaction Restored")
                creditsLabel.text = "Purchase Restored!"
                self.unlockProFeatures()
            } else if transaction.transactionState == .purchasing {
                print("purchasing")
            } else if transaction.transactionState == .deferred {
                print("deferred")
            }
        }
    }

    func unlockProFeatures(){

        print("YAY")

        UserDefaults.standard.set(true, forKey: "isUpgraded")

        upgradeLabel.text = NSLocalizedString("SUBSCRIPTION: PREMIUM", comment: "")

    }
}

【问题讨论】:

  • 你试过在实际设备上运行它吗?
  • @JulianSilvestri 是的,这就是我正在做的事情。我已将它连接到我的 iPhone XS MAX。

标签: ios swift xcode in-app-purchase swift5


【解决方案1】:

我也遇到过类似的问题,但在我的 unlockProFeatures() 版本末尾添加了这行代码后,我设法让我的应用内购买正常工作。

self.viewDidLoad()

【讨论】:

  • 但是unlockProFeatures() 根本没有运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-09
相关资源
最近更新 更多