相对于Swift尤其是inApp购买而言相对较新。 我的问题是,每当我想要恢复我的付费购买时,“恢复”按钮什么都不做。如果删除应用程序并重新安装,则不会触发恢复功能。我在论坛上进行了搜索,并尝试了许多可能的解决方案,但这不能解决我的问题。谢谢您的帮助
到目前为止,这是我的代码:
Button(action: {
iAPManager.restorePurchases()
}, label: {
Text("restorePurchases")
})
......
extension IAPManager {
static let unlockAllContentIdentifier = "com.app.fullVersion"
func product(for identifier: String) -> SKProduct? {
return fetchedProducts.first(where: { $0.productIdentifier == identifier })
}
func purchaseProduct(_ product: SKProduct) {
startObservingPaymentQueue()
buy(product) { [weak self] transaction in
guard let self = self,
let transaction = transaction else {
return
}
// If the purchase was successful and it was for the premium recipes identifiers
// then publish the unlock change
if transaction.payment.productIdentifier == IAPManager.unlockAllContentIdentifier,
transaction.transactionState == .purchased {
self.unlockedAllContent = true
UserDefaults.standard.setValue(true, forKey: "unlockedAllContent")
print("Userdefaults saved")
}
}
}
func restorePurchases() {
SKPaymentQueue.default().add(self)
SKPaymentQueue.default().restoreCompletedTransactions()
print("tapRestorePurchases")
}
}
extension IAPManager: SKPaymentTransactionObserver {
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
for transaction in transactions {
var shouldFinishTransaction = false
switch transaction.transactionState {
case .purchased, .restored:
print("Purchased purchase/restored")
completedPurchases.append(transaction.payment.productIdentifier)
shouldFinishTransaction = true
case .failed:
print("Purchased Failed")
shouldFinishTransaction = true
case .purchasing, .deferred:
break
@unknown default:
break
}
if shouldFinishTransaction {
SKPaymentQueue.default().finishTransaction(transaction)
DispatchQueue.main.async {
self.purchaseCompletionHandler?(transaction)
self.purchaseCompletionHandler = nil
}
}
}
}
func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue) {
for transaction in queue.transactions {
let t: SKPaymentTransaction = transaction
let prodID = t.payment.productIdentifier as String
switch prodID {
case "com.app.fullVersion":
// implementation of paid content if was bought
self.unlockedAllContent = true
UserDefaults.standard.setValue(true, forKey: "unlockedAllContent")
print("Userdefaults saved")
// implement the given in-app purchase as if it were bought
default:
print("iap not found")
}
}
}
func paymentQueue(_ queue: SKPaymentQueue, didRevokeEntitlementsForProductIdentifiers productIdentifiers: [String]) {
completedPurchases.removeAll(where: { productIdentifiers.contains($0) })
DispatchQueue.main.async {
if productIdentifiers.contains(IAPManager.unlockAllContentIdentifier) {
self.unlockedAllContent = false
}
}
}
}