2016-03-22 19 views
8

ich den Fehler „Verwendung von ungelösten identifier“ beim Versuch eine dieser StoreKit Konstanten zu verwenden:Verwendung von ungelösten Kennung, wenn StoreKit Konstanten mit iOS 9.3/Xcode 7.3

SKErrorClientInvalid 
SKErrorPaymentCancelled 
SKErrorPaymentInvalid 
SKErrorPaymentNotAllowed 
SKErrorStoreProductNotAvailable 
SKErrorUnknown 

Ihr Code wie folgt aussehen :

if transaction.error!.code == SKErrorPaymentCancelled { 
    print("Transaction Cancelled: \(transaction.error!.localizedDescription)") 
} 

Was hat sich geändert? Gibt es ein neues Modul, das ich importieren muss?

Antwort

18

Ab iOS 9.3 wurden bestimmte StoreKit-Konstanten aus dem SDK entfernt. Eine vollständige Liste der Änderungen finden Sie unter StoreKit Changes for Swift.

SKErrorCode.ClientInvalid 
SKErrorCode.CloudServiceNetworkConnectionFailed 
SKErrorCode.CloudServicePermissionDenied 
SKErrorCode.PaymentCancelled 
SKErrorCode.PaymentInvalid 
SKErrorCode.PaymentNotAllowed 
SKErrorCode.StoreProductNotAvailable 
SKErrorCode.Unknown 

Sie sollten Ihre transaction.error.code mit der rawValue ENUM Überprüfung überprüfen werden:

Diese Konstanten wurden zugunsten der SKErrorCode ENUM und die damit verbundenen Werte ersetzt. Beispiel:

private func failedTransaction(transaction: SKPaymentTransaction) { 
    print("failedTransaction...") 
    if transaction.error?.code == SKErrorCode.PaymentCancelled.rawValue { 
     print("Transaction Cancelled: \(transaction.error?.localizedDescription)") 
    } 
    else { 
     print("Transaction Error: \(transaction.error?.localizedDescription)") 
    } 
    SKPaymentQueue.defaultQueue().finishTransaction(transaction) 
} 

Sie sollten gegen diese Fehlercodes werden Überprüfung statt der Legacy-Konstanten, wenn eine neue Anwendung mit StoreKit auf iOS 9.3 und höher zu schaffen.

+0

"Sie sollten prüfen, überprüfen Sie Ihre transaction.error mit einem dieser Werte" ich glaube nicht, dass das möglich ist. SKErrorCode ist kein NSError. Nur .code gegen .rawValue funktioniert für mich. –

+1

@AceGreen danke Ich werde eine Bearbeitung vornehmen. So funktioniert das für dich? 'if transaction.error? .code == SKErrorCode.PaymentCancelled.rawValue {...}' – JAL

+0

Ich benutze eine switch-Anweisung aber yes .code gegen .rawValue funktioniert (Siehe Antwort unten) –

3

Hinzufügen zu @JAL Antwort here eine Schaltervariante

 switch (transaction.error!.code) { 
     case SKErrorCode.Unknown.rawValue: 
      print("Unknown error") 
      break; 
     case SKErrorCode.ClientInvalid.rawValue: 
      print("Client Not Allowed To issue Request") 
      break; 
     case SKErrorCode.PaymentCancelled.rawValue: 
      print("User Cancelled Request") 
      break; 
     case SKErrorCode.PaymentInvalid.rawValue: 
      print("Purchase Identifier Invalid") 
      break; 
     case SKErrorCode.PaymentNotAllowed.rawValue: 
      print("Device Not Allowed To Make Payment") 
      break; 
     default: 
      break; 
     } 
0

Keine der oben genannten Antworten für mich gearbeitet. Was es gelöst hat war StoreKit vor dem SKError.

Mein Schalter sah etwa so aus:

switch (transaction.error!.code) { 
     case StoreKit.SKErrorCode.Unknown.rawValue: 
      print("Unknown error") 
      break; 
} 

keine Ahnung, warum.

+0

Was war der Fehler, den Sie bekommen haben, als Sie nur auf die 'SKErrorCode'-Struktur verwiesen haben? Es klingt wie eine Namensraum-Kollision. – JAL