代码之家  ›  专栏  ›  技术社区  ›  Terry B

需要帮助从helper类实现应用内购买吗

  •  0
  • Terry B  · 技术社区  · 6 年前

    我第一次尝试IAP,我需要一些连接点的帮助。

    我的应用程序有两个不同的非消耗性IAP,我在“产品”类中设置了这两个IAP,如果它自己是这样的:

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

    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({ $0.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...")
            }
        }
    }
    

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

    我在其中一个视图控制器中设置了一个函数,用于检查其中一个视图控制器中的用户默认值,如下所示:

    func isPurchased() -> Bool {
        let purchaseStatus = UserDefaults.standard.bool(forKey: ??)
    
        if purchaseStatus == true {
            print("Previously purchased!")
            return true
        }else{
            print("Never purchased!")
            return false
        }
    }
    

    我不知道如何使用这个功能,但如果我可以,我的应用程序中有代码,如果可能的话可以使用它。

    0 回复  |  直到 6 年前
        1
  •  2
  •   Ahmet Sina Ustem    6 年前

    你可以直接使用 SKPaymentTransactionState

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

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

    或者直接从KpaymentTransactionState扩展名中获取字符串值

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

    同时,, 你不应该 您应该使用Keychain而不是UserDefaults。