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?

Hipérbole
fuente

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,
martinezdelariva
fuente
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.
JOM
fuente
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,
Un mundo
fuente
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.

ilnar_al
fuente
¡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."
ben
fuente
foros.developer.apple.com/thread/5835 <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
Lakshmi