Нужна помощь в реализации покупки из приложения в классе помощника - PullRequest
0 голосов
/ 21 мая 2019

Я пробую IAP впервые, и мне нужна помощь в соединении точек.

Мое приложение имеет два разных неиспользуемых IAP, которые я настроил в классе «product», если его собственный подобен этому:

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...")
        }
    }
}

Я хотел бы вызвать некоторые функции в другом контроллере представления при покупке продукта.Как мне это сделать?

Я вроде настраиваю функцию в одном из контроллеров представления, которая проверяет UserDefaults в одном из контроллеров представления, как это:

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

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

Я неЯ уверен, как я могу использовать эту функцию, но если я могу как-то, у меня есть приложение в моем приложении, которое будет работать с ним, если это вообще возможно.

1 Ответ

1 голос
/ 21 мая 2019

Вы можете использовать непосредственно SKPaymentTransactionState для проверки покупки.

Вы можете позвонить как thi после создания транзакции, если хотите Bool значение

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

или напрямую строковое значение из расширения SKPaymentTransactionState

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

В то же время, вы никогда не должны хранить логическое значение для проверки, купил ли пользователь покупку в приложении в UserDefaults.Пользователь может изменить его очень легко (без джейлбрейка) и получить свои вкусности бесплатно! Вы должны использовать Keychain вместо UserDefaults.

...