首页 > 解决方案 > productsRequest 从未在应用程序购买中调用 swift 5

问题描述

我是 swift 新手,所以我正在创建一个新应用程序。我正在尝试在我的应用程序中实现应用程序购买,但productsRequest方法从未调用过。我试图关注所有其他堆栈溢出响应,但没有任何改变。谁能帮我?太感谢了。

这是我的 RemoveAdsManager.swift:

import Foundation
import StoreKit

public class RemoveAdsManager {

     class func removeAds(){
         let iap = IAPManager(productID: IAPManager.removeAdsID)
         iap.beginPurchase()
     }

     class func restoreRemoveAds(){
         let iap = IAPManager(productID: IAPManager.removeAdsID)
         iap.beginRestorePurchases()
     }

     class func areAdsRemoved() -> Bool{
         return UserDefaults.standard.bool(forKey: "pro_version")
     }

     class func removeAdsSuccess(){
         UserDefaults.standard.set(true, forKey: "pro_version")
         UserDefaults.standard.synchronize()
     }

     class func restoreRemoveAdsSuccess(){
         removeAdsSuccess()
     }

     class func removeAdsFailure(){

     }

     class func removeAdsDeferred(){

     }

 }

这是我的 IAPManager.swift:

import Foundation
import StoreKit

public class IAPManager: NSObject, SKProductsRequestDelegate, SKPaymentTransactionObserver{
    static let removeAdsID = "com.******.*****.******"

    let productID: String
    init(productID: String){
        self.productID = productID
    }

    public func beginPurchase(){
        if SKPaymentQueue.canMakePayments(){
            let request = SKProductsRequest(productIdentifiers: [productID])
            request.delegate = self
            request.start()
        }
        else{
        }
    }

    public func beginRestorePurchases(){
        SKPaymentQueue.default().add(self)
        SKPaymentQueue.default().restoreCompletedTransactions()
    }

    public func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse){
        if let product = response.products.first{
            let payment = SKPayment(product: product)
            SKPaymentQueue.default().add(self)
            SKPaymentQueue.default().add(payment)
        }
        else{
            RemoveAdsManager.removeAdsFailure()
        }
    }

    public func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue){
        
        for transaction in queue.transactions{
            if transaction.transactionState == .restored{
                let productID = transaction.payment.productIdentifier

                if(productID.lowercased() == IAPManager.removeAdsID.lowercased()){
                    RemoveAdsManager.restoreRemoveAdsSuccess()
                }

                SKPaymentQueue.default().finishTransaction(transaction)
            }
        }
    }

    public func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]){
        for transaction in transactions{
            let productID = transaction.payment.productIdentifier

            switch transaction.transactionState{
            case .purchasing:
                break
            case .purchased:
                RemoveAdsManager.removeAdsSuccess()
                SKPaymentQueue.default().finishTransaction(transaction)
            case .restored:
                RemoveAdsManager.restoreRemoveAdsSuccess()
                SKPaymentQueue.default().finishTransaction(transaction)
            case .failed:
                RemoveAdsManager.removeAdsFailure()
                SKPaymentQueue.default().finishTransaction(transaction)
            case .deferred:
                RemoveAdsManager.removeAdsDeferred()
                break
            }
        }
    }

}

最后,这是用户可以按下以购买应用程序内的按钮:

@IBAction func didTapBuy() {
        RemoveAdsManager.removeAds()
    }

非常感谢您的所有帮助。我正在努力学习,所以欢迎任何回应。

标签: iosswiftiphonexcodein-app-purchase

解决方案


removeAds()似乎beginPurchase()在这一点上调用你应该调用类似的东西

let payment = SKMutablePayment(product: product)
SKPaymentQueue.default().add(payment)

推荐阅读