Xcode 8 beta 4中的新功能NSError与Swift Error协议类型相连.这会在处理失败的SKPaymentTransactions 时影响StoreKit .您应该检查以确保没有发生错误,因为事务被取消以了解是否向用户显示错误消息.你通过检查错误来做到这一点code.但有了Error代替NSError,没有code定义.我无法弄清楚如何正确获取错误代码Error.
这在Swift 3的早期版本中有效:
func failedTransaction(_ transaction: SKPaymentTransaction) {
if let transactionError = transaction.error {
if transactionError.code != SKErrorCode.paymentCancelled.rawValue {
//show error to user
}
}
...
}
Run Code Online (Sandbox Code Playgroud)
现在error是Error不是NSError,code是不是成员.
Leo*_*bus 130
在Swift 3 Error类型中访问代码和域属性的另一个选项是将其扩展如下:
extension Error {
var code: Int { return (self as NSError).code }
var domain: String { return (self as NSError).domain }
}
Run Code Online (Sandbox Code Playgroud)
And*_* M. 52
现在在Xcode 8和swift 3中,条件转换始终成功,因此您需要执行以下操作:
let code = (error as NSError).code
Run Code Online (Sandbox Code Playgroud)
并检查code您的需求.希望这可以帮助
Mur*_*gal 37
SKError在xCode 8和Swift 3中投射似乎对我有用...
guard let error = transaction.error as? SKError else {return}
switch error.code { // https://developer.apple.com/reference/storekit/skerror.code
case .unknown: break
case .paymentCancelled: break
case .clientInvalid: break
case .paymentInvalid: break
case .paymentNotAllowed: break
case .cloudServiceNetworkConnectionFailed: break
case .cloudServicePermissionDenied: break
case .storeProductNotAvailable: break
}
Run Code Online (Sandbox Code Playgroud)
没必要rawValue.
Rob*_*Rob 10
这是正确的(Apple自己的测试使用这种方法):
if error._code == SKError.code.paymentCancelled.rawValue { ... }
Run Code Online (Sandbox Code Playgroud)
另一方面,很快就会弃用强制转换为NSError:
let code = (error as NSError).code // CODE SMELL!!
if code == SKError.code.paymentCancelled.rawValue { ... }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
42705 次 |
| 最近记录: |