需要帮助 class 帮助实施应用内购买

Need help implementing in-app purchase from helper class

我是第一次尝试 IAP,我需要一些帮助来连接各个点。

我的应用程序有两个不同的非消耗性 IAP,我在 "product" class 中设置了它们,如果它自己是这样的:

enum IAPProduct: String{
    case tempoLevels  = ".....TempoLevels"
    case timingLevels = ".....TimingLevels"
}

然后我通过这样的教程设置了一个助手 class:

class IAPService: NSObject  {
    private override init() {}
    static let shared = IAPService()

    var products = [SKProduct]()
    let paymentQueue = SKPaymentQueue.default()

    func getProducts() {
        let products: Set = [IAPProduct.tempoLevels.rawValue, IAPProduct.timingLevels.rawValue]

        let request = SKProductsRequest(productIdentifiers: products)
        request.delegate = self
        request.start()
        paymentQueue.add(self)
    }

    func purchase(product: IAPProduct) {
        guard let productToPurchase = products.filter({ [=12=].productIdentifier == product.rawValue }).first
            else {return}
        let payment = SKPayment(product: productToPurchase)
        paymentQueue.add(payment)
    }
}

extension IAPService: SKProductsRequestDelegate {
    func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
        self.products = response.products
        for product in response.products {
            print(product.localizedTitle)
        }
    }   
}

extension IAPService: SKPaymentTransactionObserver {
    func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
        for transaction in transactions {
            print(transaction.transactionState.status(), transaction.payment.productIdentifier)
            switch transaction.transactionState {
            case .purchasing: break
            default: queue.finishTransaction(transaction)
            }
        }
    }
}

extension SKPaymentTransactionState {
    func status() -> String{
        switch self{
            case .deferred: return "deferred"
            case .failed: return "failed"
            case .purchased: return "purchased"
            case .purchasing: return "purchasing"
            case .restored: return "restored" 

        @unknown default:
            return("Something is wrong...")
        }
    }
}

我想在购买产品时触发另一个视图控制器中的一些功能。我该怎么做?

我在其中一个视图控制器中设置了一个函数来检查其中一个视图控制器中的 UserDefaults,如下所示:

func isPurchased() -> Bool {
    let purchaseStatus = UserDefaults.standard.bool(forKey: ??)

    if purchaseStatus == true {
        print("Previously purchased!")
        return true
    }else{
        print("Never purchased!")
        return false
    }
}

我不确定如何使用此功能,但如果我能以某种方式使用,我的应用程序中有代码可以尽可能使用它。

您可以直接使用SKPaymentTransactionState进行购买查看。

如果想要Bool值,可以在创建交易后调用like thi

func isPurchased(transaction: SKPaymentTransaction) -> Bool {
  return transaction.transactionState == .purchased
}

或直接来自 SKPaymentTransactionState 扩展的字符串值

func isPurchased(transaction: SKPaymentTransaction) -> String {
      return transaction.status
    }

与此同时,你不应该在 UserDefaults 中存储一个布尔值来检查用户是否已经购买 in-app。用户可以很容易地更改它(无需越狱)并免费获得您的好东西! 您应该使用 Keychain 而不是 UserDefaults。