Códigos de error NSURLErrorDomain sin documentar (-1001, -1003 y -1004) usando StoreKit


107

Estoy escribiendo código relacionado con StoreKit y obtengo algunos códigos de error bastante preocupantes cuando intento agregar una compra a la cola.

Hasta ahora, he experimentado los códigos de error -1003 y -1004 y no puedo encontrar nada sobre esos códigos en Internet.

La ejecución de una solicitud de producto devuelve números de producto válidos, por lo que no sé por qué [[SKPaymentQueue defaultQueue] addPayment:aPayment];fallan las llamadas a con este problema indocumentado.

El mismo código también funciona sin errores en un dispositivo pero no en otro.

Las preguntas que tengo, hasta el momento, no han sido respondidas:

¿Qué significan estos códigos? ¿Cómo puedo mitigar este problema? ¿Por qué ocurren para los intentos de compra y no para las solicitudes de productos?

La solución de problemas que he realizado incluye la regeneración de un certificado de firma y un perfil de aprovisionamiento, el cambio de redes WiFi, la limpieza, la construcción y la reinstalación de todo el software y los componentes relacionados, y ninguna de estas cosas, individualmente o juntas, ha ayudado a solucionar el problema.

EDITAR:

Encontré una discusión sobre esto en los foros de desarrollo de Apple, pero nadie de Apple respondió: https://devforums.apple.com/thread/107121?tstart=75 (se requiere una cuenta de desarrollador de iOS para ver)

EDITAR:

Hoy recibí el código de error -1001, para agregar a esta lista de problemas inexplicables e intermitentes. Todavía no hay responsabilidad de Apple, que puedo encontrar.

EDITAR:

Tengo la sospecha de que estos códigos de error se generan aleatoriamente y en realidad solo indican que el Sandbox no funciona. ¿Alguien más experimentó este problema?

Respuestas:


342

Todos los códigos de error se encuentran en "Referencias de códigos de errores de CFNetwork" en la documentación ( enlace )

Una pequeña extracción para errores de conexión CFURL y CFURLC:

  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
Estos se encuentran dentro del marco CFNetwork> encabezado CFNetworkErrors.h.
Tom Pace

1
Este documento tiene más información sobre cuándo ocurren los errores: familia NSURLError
nueve piedras

Estas constantes no se compilan en Swift, pero, por ejemplo, NSURLErrorUnknownsí. ¿Alguna pista?
Nicolas Miari

Oh, no importa ... encontré la versión Swift aquí: developer.apple.com/library/mac/documentation/Networking/…
Nicolas Miari

25

Tengo problemas similares, en mi caso parecen estar relacionados con la conectividad de la red:

Error Domain = NSURLErrorDomain Code = -1001 "Se agotó el tiempo de espera de la solicitud".

Cosas para comprobar:

  • ¿Existe alguna posibilidad de que su servidor no pueda responder dentro de algún límite de tiempo? ¿Como 60 segundos o 4 minutos?
  • ¿Existe la posibilidad de que su dispositivo esté cambiando de red (WiFi, 3G, VPN)?
  • ¿Podría alguien (cliente o servidor) estar esperando la autenticación?

Lo siento, no tengo ideas de cómo solucionarlo. Solo depurando esto, tratando de averiguar cuál es el problema (-1021, -1001, -1009)

Actualización: la búsqueda de Google fue muy amable al encontrar esto:

  • -1001 TimedOut: tomó más tiempo que el tiempo de espera asignado.
  • -1003 CannotFindHost: no se pudo encontrar el host.
  • -1004 CannotConnectToHost: el host no nos permitió establecer una conexión.

1
"¿Existe alguna posibilidad de que su servidor no pueda responder dentro de algún límite de tiempo?" Sabes, ese es el asesino, es el servidor de Apple con el que estoy tratando de contactar con este código, así que no es mi servidor el que tiene problemas.
Hipérbole

Hola Jom, En iPhone nos está funcionando bien, pero en iPad a veces nos bloqueamos, este mensaje muestra, por ejemplo, el mensaje "-1001 TimedOut". Pero mi pregunta es, si TimedOut debería venir tanto en iPhone como en iPad. Gracias de antemano @JOM
Babul

21

ver NSURLError.h Definir

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

Utilizo el siguiente método en mi proyecto

-(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;
}

Luego, solo verifico el código de error y muestro una alerta si está en la lista

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

Pero como puede ver, comenté códigos que creo que no se ajustan a mi definición de NO INTERNET. Por ejemplo, el código de -1012 (Fallo de autenticación). Puede editar la lista como desee.

En mi proyecto lo uso como nombre de usuario / contraseña ingresando desde el usuario. Y en mi opinión, los errores de conexión de red (física) podrían ser la única razón para mostrar la vista de alerta en su aplicación basada en red. En cualquier otro caso (por ejemplo, un par de nombre de usuario / contraseña incorrecto), prefiero hacer una animación personalizada y fácil de usar, O simplemente repetir el intento fallido nuevamente sin la atención del usuario. Especialmente si el usuario no inició explícitamente una llamada de red.

Atentamente martinezdelariva por un enlace a la documentación.


¡Ese podría ser un método de clase!
ilnar_al

2

Encontré un nuevo código de error que no está documentado anteriormente: 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."

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.