【发布时间】:2020-03-30 14:31:41
【问题描述】:
我正在尝试在我的应用中实现应用内购买,但它并没有按照我想要的方式工作。我只是运行一个测试,结果是当我按下upgradeButton 时,我被要求输入我的密码(它说这是沙盒模式)。当我按下 OK 并等待几秒钟时,它表示我已经购买了这个,并且将免费获得它。然后当我按下 OK 按钮时,什么也没有发生。 upgradeLabel 只是说PLEASE WAIT... 甚至没有显示来自unlockProFeatures 的YAY 日志,所以看起来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