【问题标题】:Cannot finish a purchasing Non-Renewing Subscription transaction无法完成购买非续订订阅交易
【发布时间】:2017-01-07 12:41:29
【问题描述】:

我想在我的应用中实现年度订阅,我使用StoreKit 来实现。问题是,当我点击subscriptionButton 时。引发错误的应用程序:'NSInvalidArgumentException', reason: 'Cannot finish a purchasing transaction'。我被困在这个地方,无法解决我的问题。所以,我的paymentQueue 代码如下所示:

func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
    print(transactions)
    for transaction in transactions {
        print(transaction.error ?? "")
        switch transaction.transactionState {
        case .deferred:
            print("deffered")

        case let .failed(err):
            print("failed: \(err)")
        case .purchased:
            let productID = p.productIdentifier
            selectProduct(productID: productID)
        case .purchasing:
            print("purhasing")
            print("produkt name: \(p.localizedTitle)") // after executing this line of code app crashes
        case .restored:
            let productID = p.productIdentifier
            selectProduct(productID: productID)
        }
        queue.finishTransaction(transaction)
    }
}

您有什么建议,我该如何解决?

【问题讨论】:

  • 您得到这样的结果是因为当您在执行“queue.finishTransaction(transaction)”方法后检测到购买状态时会停止进一步的处理。仅添加特定于“.purchased”、“.restored”和“.failed”状态的方法。
  • 非常适合您的建议!它有效:)

标签: ios swift storekit skpaymenttransaction


【解决方案1】:

在我的情况下,这个问题的工作解决方案是:

func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
    for transaction in transactions {
        print(transaction.error ?? "")
        switch transaction.transactionState {
        case .deferred:
            print("deffered")
            queue.finishTransaction(transaction)
        case let .failed(err):
            print("failed: \(err)")
            queue.finishTransaction(transaction)
        case .purchased:
            let productID = p.productIdentifier
            selectProduct(productID: productID)
            queue.finishTransaction(transaction)
        case .purchasing:
            print("purhasing")
        case .restored:
            let productID = p.productIdentifier
            selectProduct(productID: productID)
            queue.finishTransaction(transaction)
        }
    }
}

【讨论】:

  • case let .failed(err) 在我的环境中不起作用。虽然我不确定它是否等效,但我写了如下。 ` case .failed: let err = t.error ?? NSError() print("失败: (err)") `
猜你喜欢
  • 2023-04-03
  • 1970-01-01
  • 2022-08-24
  • 1970-01-01
  • 2014-07-19
  • 1970-01-01
  • 2011-01-05
  • 2011-04-17
  • 2017-10-29
相关资源
最近更新 更多