我在尝试测试应用内购买(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]
- 如果产品是“消耗品”类型,为什么还要关心它是否已被购买?我预计这个产品会被多次购买。
- 如何更好地调试此错误?
最佳答案
将您的代码与我上一个项目的代码进行比较。
我会在开始时进行更安全的转换(您将受到保护,免受某些意外状态的影响):
if let trans = transaction as? SKPaymentTransaction
那你我也纠正一下
default:
println("updatedTransactions: \(trans.transactionState.rawValue)")
queue.finishTransaction(trans)
因为您还可以从 8.0 开始使用 SKPaymentTransactionStateDeferred
并且它应该已完成。
关于ios - 应用内购买 - EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31892331/