ios - 为什么paymentQueue(_ :shouldAddStorePayment:_:) not being called?

标签 ios storekit

为什么没有调用 paymentQueue(:shouldAddStorePayment::) ?

我确信我已经完成了我需要做的一切。

我声明了我自己的支持 SKPaymentTransactionObserver 协议(protocol)的类:

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:) 方法。该方法中的打印语句已执行。

在这段代码中,我为 paymentQueue(:shouldAddStorePayment::) 方法返回了 false,但这并没有什么不同。这个过程就像我返回了一个真实的一样。该产品之前已经购买过,因此它会通过并让用户/测试人员再次购买。

任何帮助,将不胜感激。

这是 View Controller 的代码扩展,它从 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)

    }

}

最佳答案

根据 documentation对于这种方法

This delegate method is called when the user starts an in-app purchase in the App Store, and the transaction continues in your app. Specifically, if your app is already installed, the method is called.



当用户在 App Store 应用中兑换应用内购买的促销代码或在 App Store 应用中购买促销的应用内购买时,就会发生这种情况。

在您的应用程序中启动购买时不会调用它,因为您已经控制了当用户在您的应用程序中时是否应该允许购买。

关于ios - 为什么paymentQueue(_ :shouldAddStorePayment:_:) not being called?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52112723/

相关文章:

ios - RSA 公钥生成——Swift

ios - 自定义 UIPickerView

iphone - SKStoreproductviewcontroller 在横向模式下被截断

in-app-purchase - 使用沙盒环境为独立 WatchOS 应用程序在应用程序购买中进行测试

ios - 如何在关闭 UISearchDisplayController 时将文本保留在搜索栏中

ios - 推送通知在开发中工作正常,但设备在生产中未收到通知

ios 在 segue 期间将值传递到另一个 View

ios - 在 StoreKit 拒绝交易

ios - iPhone In App Purchase 提示在新用户的全新设备上登录 addTransactionObserver

iOS 应用内购买总是返回 SKPaymentTransactionStateFailed 并且应用崩溃且日志中没有错误