简体   繁体   English

productsRequest 从未在应用程序购买中调用 swift 5

[英]productsRequest never called in app purchases swift 5

I am new to swift so I am creating a new app.我是 swift 的新手,所以我正在创建一个新应用程序。 I am trying to implement in app purchases in my application but the productsRequest method never called.我正在尝试在我的应用程序中实现应用程序购买,但productsRequest方法从未调用过。 I tried to follow all other stack overflow responses but nothing changed.我试图关注所有其他堆栈溢出响应,但没有任何改变。 Can anyone help me?谁能帮我? Thank you so much.太感谢了。

This is my RemoveAdsManager.swift:这是我的 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(){

     }

 }

This is my IAPManager.swift:这是我的 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
            }
        }
    }

}

And finally, this is the button where the user can press to buy the in app:最后,这是用户可以按下以购买应用程序内的按钮:

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

Thank you so much for all of your help.非常感谢您的所有帮助。 I am trying to learn, so any response is welcome.我正在努力学习,所以欢迎任何回应。

removeAds() seems to calls beginPurchase() at this point you should call something like removeAds()此时似乎调用beginPurchase()您应该调用类似

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM