2016-03-22 11 views
8

ottengo l'errore "L'utilizzo di identificatore non risolto" quando si tenta di utilizzare una di queste costanti StoreKit:L'utilizzo di identificatore irrisolto quando si utilizzano le costanti StoreKit con iOS 9.3/Xcode 7.3

SKErrorClientInvalid 
SKErrorPaymentCancelled 
SKErrorPaymentInvalid 
SKErrorPaymentNotAllowed 
SKErrorStoreProductNotAvailable 
SKErrorUnknown 

il codice può assomigliare a questo :

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

Cosa è cambiato? C'è un nuovo modulo che devo importare?

risposta

18

A partire da iOS 9.3 alcune costanti StoreKit sono state rimosse dall'SDK. Vedi StoreKit Changes for Swift per l'elenco completo delle modifiche.

Queste costanti sono stati sostituiti a favore dei valori SKErrorCode enum e associati:

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

Si dovrebbe controllare essere controllando il vostro transaction.error.code con del rawValue enum. Esempio:

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) 
} 

Si dovrebbe essere il controllo nei confronti di questi codici di errore, piuttosto che le costanti legacy se la creazione di una nuova applicazione utilizzando StoreKit su iOS 9.3 e superiori.

+0

"Dovresti controllare controllando il tuo transaction.error con uno di questi valori" non penso che sia possibile. SKErrorCode non è un NSError. Solo .code contro .rawValue funziona per me. –

+1

@AceGreen grazie Farò una modifica. Quindi questo funziona per te? 'if transaction.error? .code == SKErrorCode.PaymentCancelled.rawValue {...}' – JAL

+0

Io uso un comando switch ma sì. codice contro .rawValue funziona (vedi risposta sotto) –

3

Aggiungendo a @JAL risposta heres una variante interruttore

 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

Nessuna delle risposte di cui sopra ha funzionato per me. Ciò che ha risolto è stata la preparazione di StoreKit allo SKError.

mio interruttore sembrava qualcosa di simile:

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

idea del perché.

+0

Qual era l'errore che stavi ricevendo quando facevi riferimento alla struttura 'SKErrorCode'? Sembra che tu abbia una collisione nello spazio dei nomi. – JAL