Есть ли способ получить SKProduct из SKPayment в API StoreKit?

предоставлена SKPaymentTransaction есть ли способ, чтобы получить SKProduct?

я пытаюсь реализовать общий SKPaymentTransactionObserver это позволит моему приложению получать уведомления обо всех покупках в приложении, которые происходят. Я реализовал SKPaymentTransactionObserver интерфейс, и я получаю paymentQueue: updatedTransactions: обратный вызов стрельбы правильно. В моем обратном вызове у меня есть доступ к

3 ответов


Я не думаю, что прямо сейчас можно получить эту информацию из объекта SKPaymentTransaction или его SKPayment.

вы можете запросить эту информацию, настроив SKProductRequest с одним или несколькими идентификаторами продукта. Ответ обрабатывается productsRequest: didReceiveResponse.

документация Apple имеет довольно хороший пример того, как это сделать здесь.


учитывая SKPaymentTransaction есть ли способ получить SKProduct?

вы можете получить productIdentifier из объекта транзакции, из которого вы можете получить информацию о продукте, если у вас есть массив SKProducts, посмотрев массив для productIdentifier,

transaction.payment.productIdentifier

я тоже столкнулся с этой проблемой. (Я хотел получить цену продукта после успешной покупки.) Мое решение-хранить each SKProduct на Dictionary, С помощью productIdentifier как ключ. Вот суть моей реализации (в Swift 3):

объявите словарь как свойство в своем классе:

fileprivate var products = Dictionary<String, SKProduct>()

хранить продукты в словаре, когда productsRequest(_:didReceive:) функция SKProductsRequestDelegate называется:

extension PurchaseManager: SKProductsRequestDelegate {
    func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
        for product in response.products {
            products[product.productIdentifier] = product
        }
    }
}

когда paymentQueue(_:updatedTransactions:) обратный звонок функция SKPaymentTransactionObserver вызывается, извлекает продукт из словаря:

func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
    for transaction in transactions {
        let product = products[transaction.payment.productIdentifier]
        let price = product?.price
    }
}