要解决这个问题,您可以使用以下代码示例:
import StoreKit
class ViewController: UIViewController, SKProductsRequestDelegate, SKPaymentTransactionObserver {
override func viewDidLoad() {
super.viewDidLoad()
// 添加观察者
SKPaymentQueue.default().add(self)
}
func checkIfProductPurchased(productId: String) -> Bool {
return UserDefaults.standard.bool(forKey: productId)
}
func purchaseProduct(productId: String) {
if SKPaymentQueue.canMakePayments() {
let productRequest = SKProductsRequest(productIdentifiers: [productId])
productRequest.delegate = self
productRequest.start()
} else {
// 用户禁用应用内购买
print("应用内购买被禁用")
}
}
// MARK: - SKProductsRequestDelegate
func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
if let product = response.products.first {
let payment = SKPayment(product: product)
SKPaymentQueue.default().add(payment)
} else {
print("找不到产品")
}
}
// MARK: - SKPaymentTransactionObserver
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
for transaction in transactions {
switch transaction.transactionState {
case .purchased:
completeTransaction(transaction)
case .failed:
failedTransaction(transaction)
case .restored:
restoreTransaction(transaction)
default:
break
}
}
}
func completeTransaction(_ transaction: SKPaymentTransaction) {
let productId = transaction.payment.productIdentifier
UserDefaults.standard.set(true, forKey: productId)
SKPaymentQueue.default().finishTransaction(transaction)
print("购买完成")
}
func failedTransaction(_ transaction: SKPaymentTransaction) {
if let error = transaction.error {
print("购买失败:\(error.localizedDescription)")
}
SKPaymentQueue.default().finishTransaction(transaction)
}
func restoreTransaction(_ transaction: SKPaymentTransaction) {
let productId = transaction.payment.productIdentifier
UserDefaults.standard.set(true, forKey: productId)
SKPaymentQueue.default().finishTransaction(transaction)
print("已恢复购买")
}
}
使用上述代码,您可以在应用中检查产品是否已购买,如果尚未购买,则可以进行购买操作。购买完成后,将在UserDefaults中设置产品的购买状态为true。如果用户尝试再次购买已购买的产品,将显示"此应用内购买已经购买过"的消息,并且不会再次进行购买。