在SwiftUI中恢复inApp购买

时间:2020-09-24 12:22:23

标签: swift swiftui in-app-purchase storekit

相对于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
            }
        }
    }
}

0 个答案:

没有答案
相关问题