Codici di errore NSURLErrorDomain non documentati (-1001, -1003 e -1004) utilizzando StoreKit


107

Sto scrivendo codice relativo a StoreKit e ricevo alcuni codici di errore piuttosto preoccupanti quando provo ad aggiungere un acquisto alla coda.

Finora, ho riscontrato i codici di errore -1003 e -1004 e non riesco a trovare nulla su quei codici su Internet.

L'esecuzione di una richiesta di prodotto restituisce numeri di prodotto validi, quindi non so perché le chiamate a [[SKPaymentQueue defaultQueue] addPayment:aPayment];fallirebbero con questo problema non documentato.

Lo stesso codice funziona anche senza errori su un dispositivo ma non su un altro.

Le domande che ho sono, per ora, senza risposta:

Cosa significano questi codici? Come posso mitigare questo problema? Perché accadono per tentativi di acquisto e non per richieste di prodotti?

La risoluzione dei problemi che ho eseguito include la rigenerazione di un certificato di firma e di un profilo di provisioning, la modifica delle reti WiFi, la pulizia, la creazione e la reinstallazione di tutto il software e i componenti correlati e nessuna di queste cose individualmente o insieme ha contribuito a risolvere il problema.

MODIFICARE:

Ho trovato una discussione su questo nei forum di sviluppo di Apple, ma nessuno di Apple ha risposto: https://devforums.apple.com/thread/107121?tstart=75 (per la visualizzazione è necessario un account sviluppatore iOS)

MODIFICARE:

Oggi sono stato colpito con il codice di errore -1001, da aggiungere a questo elenco di problemi inspiegabili e intermittenti. Ancora nessuna responsabilità da parte di Apple, che posso trovare.

MODIFICARE:

Ho il sospetto che questi codici di errore siano generati casualmente e in realtà indicano solo che Sandbox è inattivo. Qualcun altro ha riscontrato questo problema?

Risposte:


342

Tutti i codici di errore si trovano in "Riferimenti codici di errore di rete CF" nella documentazione ( collegamento )

Una piccola estrazione per CFURL e CFURL Errori di connessione:

  kCFURLErrorUnknown   = -998,
  kCFURLErrorCancelled = -999,
  kCFURLErrorBadURL    = -1000,
  kCFURLErrorTimedOut  = -1001,
  kCFURLErrorUnsupportedURL = -1002,
  kCFURLErrorCannotFindHost = -1003,
  kCFURLErrorCannotConnectToHost    = -1004,
  kCFURLErrorNetworkConnectionLost  = -1005,
  kCFURLErrorDNSLookupFailed        = -1006,
  kCFURLErrorHTTPTooManyRedirects   = -1007,
  kCFURLErrorResourceUnavailable    = -1008,
  kCFURLErrorNotConnectedToInternet = -1009,
  kCFURLErrorRedirectToNonExistentLocation = -1010,
  kCFURLErrorBadServerResponse             = -1011,
  kCFURLErrorUserCancelledAuthentication   = -1012,
  kCFURLErrorUserAuthenticationRequired    = -1013,
  kCFURLErrorZeroByteResource        = -1014,
  kCFURLErrorCannotDecodeRawData     = -1015,
  kCFURLErrorCannotDecodeContentData = -1016,
  kCFURLErrorCannotParseResponse     = -1017,
  kCFURLErrorInternationalRoamingOff = -1018,
  kCFURLErrorCallIsActive               = -1019,
  kCFURLErrorDataNotAllowed             = -1020,
  kCFURLErrorRequestBodyStreamExhausted = -1021,
  kCFURLErrorFileDoesNotExist           = -1100,
  kCFURLErrorFileIsDirectory            = -1101,
  kCFURLErrorNoPermissionsToReadFile    = -1102,
  kCFURLErrorDataLengthExceedsMaximum   = -1103,

2
Questi sono all'interno del framework CFNetwork> intestazione CFNetworkErrors.h.
Tom Pace

1
Questo documento contiene maggiori informazioni su quando si verificano errori: Famiglia NSURLError
nove pietre

Queste costanti non vengono compilate in Swift, ma ad es NSURLErrorUnknown. Qualche indizio?
Nicolas Miari

Oh, non importa ... ho trovato la versione Swift qui: developer.apple.com/library/mac/documentation/Networking/…
Nicolas Miari

25

Ho problemi simili, nel mio caso sembrano essere legati alla connettività di rete:

Error Domain = NSURLErrorDomain Code = -1001 "La richiesta è scaduta."

Cose da controllare:

  • C'è qualche possibilità che il tuo server non sia in grado di rispondere entro un certo limite di tempo? Come 60 secondi o 4 minuti?
  • C'è la possibilità che il tuo dispositivo stia cambiando rete (WiFi, 3G, VPN)?
  • Qualcuno (client o server) potrebbe essere in attesa dell'autenticazione?

Spiacenti, nessuna idea su come risolvere il problema. Basta eseguire il debug di questo, cercando di scoprire qual è il problema (-1021, -1001, -1009)

Aggiornamento: la ricerca su Google è stata molto gentile per trovare questo:

  • -1001 TimedOut - ci è voluto più tempo del timeout assegnato.
  • -1003 CannotFindHost: non è stato possibile trovare l'host.
  • -1004 CannotConnectToHost: l'host non ci consente di stabilire una connessione.

1
"C'è qualche possibilità che il tuo server non sia in grado di rispondere entro un certo limite di tempo?" Sai, questo è il killer, è il server di Apple che sto cercando di contattare con questo codice, quindi non è il mio server che singhiozza.
Iperbole

Ehi Jom, su iPhone funziona bene per noi, ma su iPad a volte ci sono dei crash, questo messaggio mostra il messaggio "-1001 TimedOut". Ma la mia domanda è: se TimedOut dovrebbe essere disponibile sia su iPhone che su iPad. Grazie in anticipo @JOM
Babul

21

vedere NSURLError.h Define

NSURLErrorUnknown =             -1,
NSURLErrorCancelled =           -999,
NSURLErrorBadURL =              -1000,
NSURLErrorTimedOut =            -1001,
NSURLErrorUnsupportedURL =          -1002,
NSURLErrorCannotFindHost =          -1003,
NSURLErrorCannotConnectToHost =         -1004,
NSURLErrorNetworkConnectionLost =       -1005,
NSURLErrorDNSLookupFailed =         -1006,
NSURLErrorHTTPTooManyRedirects =        -1007,
NSURLErrorResourceUnavailable =         -1008,
NSURLErrorNotConnectedToInternet =      -1009,
NSURLErrorRedirectToNonExistentLocation =   -1010,
NSURLErrorBadServerResponse =       -1011,
NSURLErrorUserCancelledAuthentication =     -1012,
NSURLErrorUserAuthenticationRequired =  -1013,
NSURLErrorZeroByteResource =        -1014,
NSURLErrorCannotDecodeRawData =             -1015,
NSURLErrorCannotDecodeContentData =         -1016,
NSURLErrorCannotParseResponse =             -1017,
NSURLErrorAppTransportSecurityRequiresSecureConnection NS_ENUM_AVAILABLE(10_11, 9_0) = -1022,
NSURLErrorFileDoesNotExist =        -1100,
NSURLErrorFileIsDirectory =         -1101,
NSURLErrorNoPermissionsToReadFile =     -1102,
NSURLErrorDataLengthExceedsMaximum NS_ENUM_AVAILABLE(10_5, 2_0) =   -1103,

// SSL errors
NSURLErrorSecureConnectionFailed =      -1200,
NSURLErrorServerCertificateHasBadDate =     -1201,
NSURLErrorServerCertificateUntrusted =  -1202,
NSURLErrorServerCertificateHasUnknownRoot = -1203,
NSURLErrorServerCertificateNotYetValid =    -1204,
NSURLErrorClientCertificateRejected =   -1205,
NSURLErrorClientCertificateRequired =   -1206,
NSURLErrorCannotLoadFromNetwork =       -2000,

// Download and file I/O errors
NSURLErrorCannotCreateFile =        -3000,
NSURLErrorCannotOpenFile =          -3001,
NSURLErrorCannotCloseFile =         -3002,
NSURLErrorCannotWriteToFile =       -3003,
NSURLErrorCannotRemoveFile =        -3004,
NSURLErrorCannotMoveFile =          -3005,
NSURLErrorDownloadDecodingFailedMidStream = -3006,
NSURLErrorDownloadDecodingFailedToComplete =-3007,

NSURLErrorInternationalRoamingOff NS_ENUM_AVAILABLE(10_7, 3_0) =         -1018,
NSURLErrorCallIsActive NS_ENUM_AVAILABLE(10_7, 3_0) =                    -1019,
NSURLErrorDataNotAllowed NS_ENUM_AVAILABLE(10_7, 3_0) =                  -1020,
NSURLErrorRequestBodyStreamExhausted NS_ENUM_AVAILABLE(10_7, 3_0) =      -1021,

NSURLErrorBackgroundSessionRequiresSharedContainer NS_ENUM_AVAILABLE(10_10, 8_0) = -995,
NSURLErrorBackgroundSessionInUseByAnotherProcess NS_ENUM_AVAILABLE(10_10, 8_0) = -996,
NSURLErrorBackgroundSessionWasDisconnected NS_ENUM_AVAILABLE(10_10, 8_0)= -997,

3

Uso il seguente metodo nel mio progetto

-(NSArray*)networkErrorCodes
{
    static NSArray *codesArray;
    if (![codesArray count]){
        @synchronized(self){
            const int codes[] = {
                //kCFURLErrorUnknown,     //-998
                //kCFURLErrorCancelled,   //-999
                //kCFURLErrorBadURL,      //-1000
                //kCFURLErrorTimedOut,    //-1001
                //kCFURLErrorUnsupportedURL, //-1002
                //kCFURLErrorCannotFindHost, //-1003
                kCFURLErrorCannotConnectToHost,     //-1004
                kCFURLErrorNetworkConnectionLost,   //-1005
                kCFURLErrorDNSLookupFailed,         //-1006
                //kCFURLErrorHTTPTooManyRedirects,    //-1007
                kCFURLErrorResourceUnavailable,     //-1008
                kCFURLErrorNotConnectedToInternet,  //-1009
                //kCFURLErrorRedirectToNonExistentLocation,   //-1010
                kCFURLErrorBadServerResponse,               //-1011
                //kCFURLErrorUserCancelledAuthentication,     //-1012
                //kCFURLErrorUserAuthenticationRequired,      //-1013
                //kCFURLErrorZeroByteResource,        //-1014
                //kCFURLErrorCannotDecodeRawData,     //-1015
                //kCFURLErrorCannotDecodeContentData, //-1016
                //kCFURLErrorCannotParseResponse,     //-1017
                kCFURLErrorInternationalRoamingOff, //-1018
                kCFURLErrorCallIsActive,                //-1019
                //kCFURLErrorDataNotAllowed,              //-1020
                //kCFURLErrorRequestBodyStreamExhausted,  //-1021
                kCFURLErrorFileDoesNotExist,            //-1100
                //kCFURLErrorFileIsDirectory,             //-1101
                kCFURLErrorNoPermissionsToReadFile,     //-1102
                //kCFURLErrorDataLengthExceedsMaximum,     //-1103
            };
            int size = sizeof(codes)/sizeof(int);
            NSMutableArray *array = [[NSMutableArray alloc] init];
            for (int i=0;i<size;++i){
                [array addObject:[NSNumber numberWithInt:codes[i]]];
            }
            codesArray = [array copy];
        }
    }
    return codesArray;
}

Quindi controllo il codice di errore e mostro un avviso se è nell'elenco

if ([[self networkErrorCodes] containsObject:[NSNumber
numberWithInt:[error code]]]){ 
// Fire Alert View Here
}

Ma come puoi vedere ho commentato codici che secondo me non si adattano alla mia definizione di NO INTERNET. Ad esempio il codice di -1012 (Autenticazione fallita.) Puoi modificare l'elenco come preferisci.

Nel mio progetto lo uso al nome utente / password inserendo da utente. E a mio avviso, gli errori di connessione di rete (fisici) potrebbero essere l'unico motivo per mostrare la visualizzazione degli avvisi nella tua app basata sulla rete. In ogni altro caso (es. Coppia nome utente / password errata) preferisco fare un'animazione user friendly personalizzata, OPPURE ripetere semplicemente il tentativo fallito di nuovo senza alcuna attenzione dell'utente. Soprattutto se l'utente non ha avviato esplicitamente una chiamata di rete.

Saluti a martinezdelariva per un collegamento alla documentazione.


Potrebbe essere un metodo di classe!
ilnar_al

2

Ho trovato un nuovo codice di errore che non è documentato sopra: CFNetworkErrorCode -1022

Error Domain=NSURLErrorDomain Code=-1022 "The resource could not be loaded because the App Transport Security policy requires the use of a secure connection."

forum.developer.apple.com/thread/5835 <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
Lakshmi

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.