如何使用 Swift 中的应用内购买检查产品是否已购买?

时间:2021-06-18 11:23:22

标签: swift in-app-purchase

我已经在我的应用程序中实现了应用内购买,并且运行良好。当用户购买东西时,按钮从“Kaufen”变为“Abenteuer starten”,但每次用户再次启动应用程序时,按钮将再次显示“Kaufen”。如果我按购买它有效,用户不必再次付费。视图控制器是否有可能在开始时检查应用内购买的状态? “Kaufen”的意思是买;)。这是我的代码:

import UIKit
import StoreKit



class TrailDescriptionVC: UIViewController {
    
    @IBOutlet weak var questionImage:UIImageView!
    @IBOutlet weak var questiontxt:UILabel!
    @IBOutlet weak var btn:UIButton!
    
    var quiz:Quiz?
    var products: [SKProduct] = []
    
    

    override func viewDidLoad() {
        super.viewDidLoad()
        self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false
        navigationItem.hidesBackButton = false
        
        

        self.title = quiz?.name ?? ""
        setupUI()
        if (quiz?.isFree ?? false) != true{
            let restoreButton = UIBarButtonItem(title: "Wiederherstellen",
                                                style: .plain,
                                                target: self,
                                                action: #selector(TrailDescriptionVC.restoreTapped(_:)))
            navigationItem.rightBarButtonItem = restoreButton
        }
        
        NotificationCenter.default.addObserver(self, selector: #selector(TrailDescriptionVC.handlePurchaseNotification(_:)),
                                               name: .IAPHelperPurchaseNotification,
                                               object: nil)
    }
    
    override func viewDidAppear(_ animated: Bool) {
      super.viewDidAppear(animated)
        if (quiz?.isFree ?? false) != true{
            reload()
        }
    }
    
    @objc func reload() {
      products = []
        if Network.isAvailable {
            startLoading("")
            QuizProducts.store.requestProducts{ [weak self] success, products in
              guard let self = self else { return }
              if success {
                self.products = products!
              }
                DispatchQueue.main.async {
                    self.finishLoading()
                }
            }
        }else{
            self.alertMessage(message: "No Internet Connection", completionHandler: nil)
        }
    }
    
    @objc func restoreTapped(_ sender: AnyObject) {
      QuizProducts.store.restorePurchases()
    }
    
    @objc func handlePurchaseNotification(_ notification: Notification) {
        setupIAP()
    }
    
    private func setupUI(){
        if let ques = quiz{
            questionImage.image = UIImage(named: "last")
            questiontxt.text = ques.trailDescription
            setupIAP()
        }
    }
    
    private func setupIAP(){
        if (quiz?.isFree ?? false) == true{
            btn.setTitle("Abenteuer starten", for: .normal)
            return
        }
        guard let product = products.first else {
            btn.setTitle("Kaufen", for: .normal)
            return
        }
        if QuizProducts.store.isProductPurchased(product.productIdentifier){
            btn.setTitle("Abenteuer starten", for: .normal)
        }else{
            btn.setTitle("Kaufen", for: .normal)
        }
    }
    
    static let priceFormatter: NumberFormatter = {
        let formatter = NumberFormatter()
        formatter.formatterBehavior = .behavior10_4
        formatter.numberStyle = .currency
        return formatter
    }()
    
    @IBAction func moveOn(_ sender:UIButton){
        
        if (quiz?.isFree ?? false) == true{
            move()
        }else{
            guard let product = products.first else {
                return
            }
            
            TrailDescriptionVC.priceFormatter.locale = product.priceLocale
            if QuizProducts.store.isProductPurchased(product.productIdentifier){
                move()
            }else{
                let alert = UIAlertController(title:"Danke!", message: "Mit deinem Beitrag unterstüzt du unseren Verein. Du erhälst alle Trails, für immer!", preferredStyle: .alert)
                let buy = UIAlertAction(title: (TrailDescriptionVC.priceFormatter.string(from: product.price) ?? "")+" / \(product.localizedTitle)", style: .default) { (action:UIAlertAction) in
                    QuizProducts.store.buyProduct(product)
                }
                alert.addAction(buy)
                let cancel = UIAlertAction(title: "Cancel", style: .cancel) { (action:UIAlertAction) in
                    self.dismiss(animated: true, completion: nil)
                }
                alert.addAction(cancel)
                self.present(alert, animated: true, completion: nil)
            }
        }
    }
    
    private func move(){
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let vc = storyboard.instantiateViewController(withIdentifier: "QuestionVC") as! QuestionVC
        vc.quiz = quiz
        self.navigationController?.pushViewController(vc, animated: true)
    }
}

1 个答案:

答案 0 :(得分:0)

其实,这有很多方法,我想到的第一件事是; 购买完成后可以用bool保存到手机内存中。

var purchase = false

    let firstopen = UserDefaults.standard.bool(forKey: "first")
    if firstopen {
        purchase = UserDefaults.standard.bool(forKey: "purchase")
    }
    else {
        UserDefaults.standard.set(true, forKey: "first")
        UserDefaults.standard.set(true, forKey: "purchase")
    }
    
    
    if purchase == true {
        print("already purchased")
    }
    else {
        print("not purchased")
    }
  • 第一次运行此代码时,它将在手机内存中将 bool 保存为 true,并且在第一次运行后您将始终获得 true 值如果代码不起作用,您将始终获得 false。
  • 当用户删除应用程序时,这些数据会从手机中删除,但当用户说恢复购买时,您可以使用相同的代码。
  • 简而言之,这里的重点是使用 UserDefaults.standard.bool(forKey: "")。以不同方式使用它取决于您。