如何正确处理 iOS 应用的应用内购买以及如何定义产品?
How to properly handle In App Purchases for iOS apps and how to define the product?
我按照这个 guide 在我的应用程序中设置了应用程序内购买。我已完成所有操作并在 App Store Connect 中进行了设置。我的问题是目前的实际购买只是 ArePagesUnlocked = true
的 UserDefaults 中的一个布尔值,但我在产品中的实际定义位置上遇到了问题。我了解如何设置和管理购买和恢复,但我实际上在哪里定义产品作为将 ArePagesUnlocked 的值从 false 更改为 true 的指令,在购买按钮操作上?我试过了,但如果没有连接,那么用户仍然解锁了它。我必须单独构建并发送吗?我在研究过程中一直有点困惑,到目前为止还没有找到明确的答案,因此我们将不胜感激。谢谢。
编辑:代码:
public init(productIds: Set<ProductIdentifier>) {
productIdentifiers = productIds
for productIdentifier in productIds {
let purchased = UserDefaults.standard.bool(forKey: productIdentifier) // this i use to see if purchased
if purchased {
purchasedProductIdentifiers.insert(productIdentifier)
print("Previously purchased: \(productIdentifier)")
} else {
print("Not purchased: \(productIdentifier)")
}
}
super.init()
SKPaymentQueue.default().add(self)
}
}
我是否需要从上面的值中添加一个单独的 UD 值?好像是重启app后才知道自己购买了,请问如何做到即时?
extension IAPHelper: SKPaymentTransactionObserver {
public func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
for transaction in transactions {
switch (transaction.transactionState) {
case .purchased:
complete(transaction: transaction)
break
case .failed:
fail(transaction: transaction)
break
case .restored:
restore(transaction: transaction)
break
case .deferred:
break
case .purchasing:
break
}
}
}
private func complete(transaction: SKPaymentTransaction) {
print("complete...")
deliverPurchaseNotificationFor(identifier: transaction.payment.productIdentifier)
SKPaymentQueue.default().finishTransaction(transaction)
}
private func restore(transaction: SKPaymentTransaction) {
guard let productIdentifier = transaction.original?.payment.productIdentifier else { return }
print("restore... \(productIdentifier)")
deliverPurchaseNotificationFor(identifier: productIdentifier)
SKPaymentQueue.default().finishTransaction(transaction)
}
private func fail(transaction: SKPaymentTransaction) {
print("fail...")
if let transactionError = transaction.error as NSError?,
let localizedDescription = transaction.error?.localizedDescription,
transactionError.code != SKError.paymentCancelled.rawValue {
print("Transaction Error: \(localizedDescription)")
}
SKPaymentQueue.default().finishTransaction(transaction)
}
private func deliverPurchaseNotificationFor(identifier: String?) {
guard let identifier = identifier else { return }
purchasedProductIdentifiers.insert(identifier)
UserDefaults.standard.set(true, forKey: identifier)
NotificationCenter.default.post(name: .IAPHelperPurchaseNotification, object: identifier)
}
通常的策略是在您的 paymentQueue(_:updatedTransactions:)
中写入用户默认值,如果用户购买的话。
我按照这个 guide 在我的应用程序中设置了应用程序内购买。我已完成所有操作并在 App Store Connect 中进行了设置。我的问题是目前的实际购买只是 ArePagesUnlocked = true
的 UserDefaults 中的一个布尔值,但我在产品中的实际定义位置上遇到了问题。我了解如何设置和管理购买和恢复,但我实际上在哪里定义产品作为将 ArePagesUnlocked 的值从 false 更改为 true 的指令,在购买按钮操作上?我试过了,但如果没有连接,那么用户仍然解锁了它。我必须单独构建并发送吗?我在研究过程中一直有点困惑,到目前为止还没有找到明确的答案,因此我们将不胜感激。谢谢。
编辑:代码:
public init(productIds: Set<ProductIdentifier>) {
productIdentifiers = productIds
for productIdentifier in productIds {
let purchased = UserDefaults.standard.bool(forKey: productIdentifier) // this i use to see if purchased
if purchased {
purchasedProductIdentifiers.insert(productIdentifier)
print("Previously purchased: \(productIdentifier)")
} else {
print("Not purchased: \(productIdentifier)")
}
}
super.init()
SKPaymentQueue.default().add(self)
}
}
我是否需要从上面的值中添加一个单独的 UD 值?好像是重启app后才知道自己购买了,请问如何做到即时?
extension IAPHelper: SKPaymentTransactionObserver {
public func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
for transaction in transactions {
switch (transaction.transactionState) {
case .purchased:
complete(transaction: transaction)
break
case .failed:
fail(transaction: transaction)
break
case .restored:
restore(transaction: transaction)
break
case .deferred:
break
case .purchasing:
break
}
}
}
private func complete(transaction: SKPaymentTransaction) {
print("complete...")
deliverPurchaseNotificationFor(identifier: transaction.payment.productIdentifier)
SKPaymentQueue.default().finishTransaction(transaction)
}
private func restore(transaction: SKPaymentTransaction) {
guard let productIdentifier = transaction.original?.payment.productIdentifier else { return }
print("restore... \(productIdentifier)")
deliverPurchaseNotificationFor(identifier: productIdentifier)
SKPaymentQueue.default().finishTransaction(transaction)
}
private func fail(transaction: SKPaymentTransaction) {
print("fail...")
if let transactionError = transaction.error as NSError?,
let localizedDescription = transaction.error?.localizedDescription,
transactionError.code != SKError.paymentCancelled.rawValue {
print("Transaction Error: \(localizedDescription)")
}
SKPaymentQueue.default().finishTransaction(transaction)
}
private func deliverPurchaseNotificationFor(identifier: String?) {
guard let identifier = identifier else { return }
purchasedProductIdentifiers.insert(identifier)
UserDefaults.standard.set(true, forKey: identifier)
NotificationCenter.default.post(name: .IAPHelperPurchaseNotification, object: identifier)
}
通常的策略是在您的 paymentQueue(_:updatedTransactions:)
中写入用户默认值,如果用户购买的话。