我已经在我的应用程序中实现了应用内购买,并且运行良好。当用户购买东西时,按钮从“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)
}
}
答案 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")
}
UserDefaults.standard.bool(forKey: "")
。以不同方式使用它取决于您。