Почему не вызывается paymentQueue (: shouldAddStorePayment: :)?
Я уверен, что сделал все, что мне нужно.
Я объявил свой собственный класс, который поддерживает протокол SKPaymentTransactionObserver:
import UIKit
import StoreKit
import AudioToolbox.AudioServices
class UTIPaymentTransactionObserver: NSObject, SKPaymentTransactionObserver {
func paymentQueue(_ queue: SKPaymentQueue, shouldAddStorePayment payment: SKPayment, for product: SKProduct) -> Bool {
print("!!! shouldAddStorePayment")
AudioServicesPlayAlertSound(kSystemSoundID_Vibrate)
return false
}
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
print("!!! updatedTransactions")
for transaction in transactions {
print("!!! transaction=", transaction)
switch transaction.transactionState {
// Call the appropriate custom method for the transaction state.
case SKPaymentTransactionState.purchasing:
showTransactionAsInProgress(transaction, deferred: false)
case SKPaymentTransactionState.deferred:
showTransactionAsInProgress(transaction, deferred: true)
case SKPaymentTransactionState.failed:
failedTransaction(transaction)
case SKPaymentTransactionState.purchased:
completeTransaction(transaction)
case SKPaymentTransactionState.restored:
restoreTransaction(transaction)
}
}
}
func showTransactionAsInProgress(_ transaction: SKPaymentTransaction, deferred: Bool) {
print("!!! showTransactionAsInProgress")
}
func failedTransaction(_ transaction: SKPaymentTransaction) {
print("!!! failedTransaction")
SKPaymentQueue.default().finishTransaction(transaction)
}
func completeTransaction(_ transaction: SKPaymentTransaction) {
print("!!! completeTransaction")
SKPaymentQueue.default().finishTransaction(transaction)
}
func restoreTransaction(_ transaction: SKPaymentTransaction) {
print("!!! restoreTransaction")
}
}
Я добавил код для вибрации устройства при вызове paymentQueue (: shouldAddStorePayment: :), чтобы указать, что метод действительно вызывается.
Я объявил экземпляр класса-наблюдателя глобально:
internal let paymentTransactionObserver = UTIPaymentTransactionObserver()
Я убедился, что добавил наблюдателя в AppDelegate:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
SKPaymentQueue.default().add(paymentTransactionObserver)
return true
}
Оператор печати в методе paymentQueue (: shouldAddStorePayment: :) никогда не печатает, а устройство никогда не вибрирует. Не похоже, что этот метод вызывается.
Вызывается метод paymentQueue (_: updatedTransactions :). Оператор print в этом методе выполнен.
В этом коде я возвратил false для метода paymentQueue (: shouldAddStorePayment: :), но это не имеет значения. Процесс проходит так, как будто я вернул истину. Продукт уже был приобретен ранее, поэтому он проходит и позволяет пользователю / тестеру приобрести его снова.
Буду признателен за любую помощь.
Вот расширение кода для контроллера представления, который извлекает продукт из App Store и представляет мой пользовательский интерфейс, который позволяет пользователю приобрести продукт:
Я вызываю validateProductIdentifiers (), чтобы начать процесс продажи продукта пользователю.
// MARK: - SKProductsRequestDelegate
extension CloudViewController: SKProductsRequestDelegate {
func validateProductIdentifiers() {
let url = Bundle.main.url(forResource: "Purchase", withExtension: "plist")!
let nsArrayProductIdentifiers: NSArray = NSArray(contentsOf: url)!
let productIdentifiers = nsArrayProductIdentifiers as! [String]
print(productIdentifiers)
let setProductIdentifers: Set = Set(productIdentifiers)
let productsRequest = SKProductsRequest(productIdentifiers: setProductIdentifers)
self.productsRequest = productsRequest
productsRequest.delegate = self
productsRequest.start()
}
func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
print("!!! didReceive")
self.products = response.products
let alertMessage = "Would you like to purchase?"
let alert = UIAlertController(title: nil, message: alertMessage, preferredStyle: .actionSheet)
let actionYes = UIAlertAction(title: "Yes", style: .default) {
action in
// Purchase
let product: SKProduct = response.products.first!
let payment: SKMutablePayment = SKMutablePayment(product: product)
SKPaymentQueue.default().add(payment)
}
let actionNo = UIAlertAction(title: "No", style: .cancel, handler: nil)
alert.addAction(actionYes)
alert.addAction(actionNo)
alert.popoverPresentationController?.barButtonItem = barButtonItemEnableDropbox
present(alert, animated: true, completion: nil)
}
}