Почему paymentQueue (_: shouldAddStorePayment: _ :) не вызывается? - PullRequest
0 голосов
/ 31 августа 2018

Почему не вызывается 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)

    }

}

1 Ответ

0 голосов
/ 31 августа 2018

Согласно документации для этого метода

Этот метод делегата вызывается, когда пользователь запускает покупку в приложении в App Store, а транзакция продолжается в вашем приложении. В частности, если ваше приложение уже установлено, вызывается метод.

Это происходит, когда пользователь выкупает промо-код для покупки в приложении в приложении App Store или покупает проданную покупку в приложении в приложении App Store.

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

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