При покупке приложения - определить, совершил ли пользователь эту покупку - PullRequest
1 голос
/ 23 июня 2019

У меня есть следующий код для совершения покупок в приложении.Все работает отлично, и пользователь может приобрести (не расходные материалы) по нажатию кнопки.

В настоящее время я вызываю getProducts() и restorePurchases() внутри AppDelegate - когда пользователь уже совершил покупку, я предполагаю, что она будет доставлена ​​с помощью restorePurchases() - , как я могу определить, является ли конкретныйпродукт с его идентификатором уже был приобретен , чтобы скрыть эту кнопку.

import Foundation
import StoreKit

class IAPService: NSObject {

    private override init() {}
    static let shared = IAPService() 
    var products = [SKProduct]()
    let paymentQueue = SKPaymentQueue.default() 
    private var purchasedProductIdentifiers: Set<String> = []

    func getProducts() {
        let product: Set = ["123456"]
        let request = SKProductsRequest(productIdentifiers: product)
        request.delegate = self
        request.start()
        paymentQueue.add(self)
    }

    func purchase() {
        guard let productToPurchase = products.first else { return }
        print(productToPurchase)
        let payment = SKPayment(product: productToPurchase)
        paymentQueue.add(payment)
    }

    func restorePurchases() {
        paymentQueue.restoreCompletedTransactions()
    }

}

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

1 Ответ

1 голос
/ 23 июня 2019

Вам необходимо проверить обратный вызов updatedTransactions для необходимых productIdentifier и его состояние purchased / restored

func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
    for transaction in transactions {
        if transaction.payment.productIdentifier == "someId" && ( transaction.transactionState == .purchased || transaction.transactionState == .restored ) {
            // purchased / resorted
        } 
    }
}

Полезные ссылки

https://www.raywenderlich.com/5456-in-app-purchase-tutorial-getting-started

покупка в приложении в Swift с одним продуктом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...