Neu in Xcode 8 Beta 4, NSError
ist mit dem Swift- Error
Protokolltyp verbunden. Dies wirkt sich auf StoreKit aus, wenn fehlerhafte SKPaymentTransaction
s behandelt werden. Sie sollten überprüfen, ob der Fehler nicht aufgetreten ist, da die Transaktion abgebrochen wurde, um festzustellen, ob dem Benutzer eine Fehlermeldung angezeigt werden soll. Sie tun dies, indem Sie die Fehler untersuchen code
. Aber mit Error
statt NSError
gibt es keine code
definiert. Ich konnte nicht herausfinden, wie ich den Fehlercode richtig abrufen kann Error
.
Dies funktionierte in der vorherigen Version von Swift 3:
func failedTransaction(_ transaction: SKPaymentTransaction) {
if let transactionError = transaction.error {
if transactionError.code != SKErrorCode.paymentCancelled.rawValue {
//show error to user
}
}
...
}
Nun das error
ist ein Error
nicht NSError
, code
ist kein Mitglied.
if (transaction.error as NSError).code != SKErrorCode.PaymentCancelled {
NSError
, danke @LeoDabusAntworten:
Casting to
SKError
scheint in xCode 8 und Swift 3 für mich zu funktionieren ...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 }
Keine Notwendigkeit für
rawValue
.quelle
NSError
. Bestätigt, dass es funktioniert.Eine weitere Option für den Zugriff auf Code- und Domäneneigenschaften in Swift 3-Fehlertypen besteht darin, sie wie folgt zu erweitern:
extension Error { var code: Int { return (self as NSError).code } var domain: String { return (self as NSError).domain } }
quelle
Jetzt in Xcode 8 und Swift 3 ist die bedingte Umwandlung immer erfolgreich, daher müssen Sie Folgendes tun:
let code = (error as NSError).code
und überprüfen Sie die
code
für Ihre Bedürfnisse. Hoffe das hilftquelle
Dies ist richtig (Apples eigene Tests verwenden diesen Ansatz):
if error._code == SKError.code.paymentCancelled.rawValue { ... }
Auf der anderen Seite wird das Casting in NSError wahrscheinlich bald veraltet sein:
let code = (error as NSError).code // CODE SMELL!! if code == SKError.code.paymentCancelled.rawValue { ... }
quelle
.code
in einemif let
oder einem zugreifenguard let
und nicht nur blind davon ausgehen, dass die Besetzung funktioniert hat.Verwenden
um den Fehlercode abzugleichen.
quelle
Vieles ändert sich. Hier ist das Update für Xcode 11.
if let skError = transaction.error as? SKError, skError.code == .paymentCancelled { print("Cancelled") }
quelle