为什么没有调用 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/