Nouveau dans Xcode 8 beta 4, NSError
est ponté vers le type de protocole Swift Error
. Cela affecte StoreKit lorsqu’il s’agit d’un échec de SKPaymentTransaction
s. Vous devez vérifier que l'erreur ne s'est pas produite parce que la transaction a été annulée pour savoir si un message d'erreur doit être affiché ou non. Vous faites cela en examinant l'erreur code
. Mais avec Error
au lieu de NSError
, il n'y a pas de code
défini. Je n'ai pas été capable de comprendre comment obtenir correctement le code d'erreur de Error
.
Cela fonctionnait dans la version précédente de Swift 3:
func failedTransaction(_ transaction: SKPaymentTransaction) {
if let transactionError = transaction.error {
if transactionError.code != SKErrorCode.paymentCancelled.rawValue {
//show error to user
}
}
...
}
Maintenant que error
est un Error
pas NSError
, code
n'est pas un membre.
Casting to SKError
semble fonctionner pour moi dans xCode 8 et 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
}
Pas besoin de rawValue
.
Une autre option permettant d’accéder au code et aux propriétés du domaine dans Swift 3 Types d’erreur est de l’étendre comme suit:
extension Error {
var code: Int { return (self as NSError).code }
var domain: String { return (self as NSError).domain }
}
Maintenant, dans Xcode 8 et Swift 3, la conversion conditionnelle réussit toujours. Vous devez donc procéder comme suit:
let code = (error as NSError).code
et vérifiez la code
pour vos besoins. J'espère que cela t'aides
C'est correct (les propres tests d'Apple utilisent cette approche):
if error._code == SKError.code.paymentCancelled.rawValue { ... }
Par contre, le casting sur NSError sera probablement bientôt obsolète:
let code = (error as NSError).code // CODE SMELL!!
if code == SKError.code.paymentCancelled.rawValue { ... }