Ошибка покупки в приложении, не работает должным образом - PullRequest
0 голосов
/ 30 марта 2020

Я пытаюсь реализовать покупку внутри приложения в моем приложении, но она не работает так, как я хочу. Я просто запускаю тест, и что происходит, когда я нажимаю upgradeButton, меня просят ввести мой пароль (и он говорит, что это режим песочницы). Когда я нажимаю OK и жду несколько секунд, он говорит, что я уже купил это, и получу это бесплатно. Когда я нажимаю кнопку ОК, ничего не происходит. upgradeLabel просто говорит PLEASE WAIT... Даже журнал YAY из unlockProFeatures не отображается, поэтому похоже, что 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: "")

    }
}

1 Ответ

0 голосов
/ 30 марта 2020

У меня была похожая проблема, но после добавления этой строки кода в конце моей версии unlockProFeatures () мне удалось заставить свою покупку в приложении работать.

self.viewDidLoad()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...