【问题标题】:In App Purchasing - EXC_BAD_ACCESS应用内购买 - EXC_BAD_ACCESS
【发布时间】:2015-08-08 19:41:04
【问题描述】:

我在尝试测试应用内购买(iOS 8+ Swift 1.2)时遇到了一些奇怪的问题。我在 iTunes 连接帐户中有一个消耗品,我能够很好地检索产品和产品详细信息。在我要发起购买的时候,EXC_BAD_ACCESS崩溃前的那一行代码在

//Transaction has been made
func paymentQueue(queue: SKPaymentQueue!, updatedTransactions transactions: [AnyObject]!) {

    if(list.count == 0){
        return
    }

    //code
    for transaction:AnyObject in transactions{
        var trans = transaction as! SKPaymentTransaction
        println(trans.error)

        switch trans.transactionState {
        case .Purchasing:
            println("Purchasing...The transaction is being processed by the App Store.")
        case .Purchased:
            println("Buy, ok unlock iap here")
            println(p.productIdentifier)
            queue.finishTransaction(trans)
            let prodID = p.productIdentifier! as String
            switch prodID {
                case iapID:
                    println("send submission")
                    saveSuperSubmission()
                default:
                    println("IAP not Setup")
            }
        case .Failed:
            println("buy error")
            queue.finishTransaction(trans)
        default:
            println("updatedTransactions: \(trans.transactionState.rawValue)")
            break;
        }
    }
}

点击 .Purchasing 案例后,它立即崩溃。现在在物理设备上询问我的密码后,出现购买产品的确认提示,当我选择购买时,另一个提示显示“此应用内购买已被购买”。一旦崩溃发生,Xcode 不会在跟踪中显示我的任何代码。它显示 UIApplicationMain 和如下所示

  0x2daf0a04 <+1436>: blx    0x2e1ae2c8                ; symbol stub for: CFDictionaryRemoveAllValues$shim
    0x2daf0a08 <+1440>: ldr    r0, [sp, #0x2c]
    0x2daf0a0a <+1442>: ldr    r1, [sp, #0x18]
  1. 如果产品属于“消耗品”类型,为什么它会关心已经购买的产品?我希望这会被多次购买。
  2. 如何更好地调试此错误?

【问题讨论】:

    标签: ios swift in-app-purchase storekit


    【解决方案1】:

    将您的代码与我上一个项目的代码进行比较。

    我会在开始时做一个更安全的演员表(你会被保护免受一些意想不到的状态):

    if let trans = transaction as? SKPaymentTransaction
    

    那你我也纠正一下

        default:
            println("updatedTransactions: \(trans.transactionState.rawValue)")
            queue.finishTransaction(trans)
    

    因为你也可以从 8.0 开始拥有SKPaymentTransactionStateDeferred,它应该已经完成​​了。

    【讨论】:

    • 感谢您的回复,我添加了这些编辑,但仍然崩溃。在方法的末尾放置一个断点仍然会被捕获,但是我不知道之后会发生什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多