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

Estoy escribiendo código relacionado con StoreKit, y estoy obteniendo algunos códigos de error bastante preocupantes cuando trato de agregar una compra a la cola.

Hasta ahora, he experimentado los códigos de error -1003 y -1004 y no puedo encontrar nada acerca de 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é se llaman a [[SKPaymentQueue defaultQueue] addPayment:aPayment]; fallaría con este problema no documentado.

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

Las preguntas que tengo son, hasta el momento, sin respuesta:

¿Qué significan estos códigos? ¿Cómo puedo mitigar este problema? ¿Por qué están sucediendo para bashs de compra y no para 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 y la construcción y reinstalación de todos los software y componentes relacionados, y ninguno de estos elementos, individualmente o en conjunto, ayudó a solucionar el problema.

EDITAR:

Encontré una discusión sobre esto en los foros de desarrolladores 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 tengo la responsabilidad de Apple, que puedo encontrar.

EDITAR:

Tengo la sospecha de que estos códigos de error se generan aleatoriamente y realmente solo indican que Sandbox está inactivo. ¿Alguien más experimentó este problema?

Todos los códigos de error están en “Referencias de códigos de errores CFNetwork” en la documentación ( enlace )

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

  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, 

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

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

Cosas para verificar:

  • ¿Hay alguna posibilidad de que su servidor no pueda responder dentro de un 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 vs. servidor) esperar la autenticación?

Lo sentimos, no hay ideas de cómo solucionarlo. Simplemente depurando esto, tratando de descubrir cuál es el problema (-1021, -1001, -1009)

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

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

vea 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, 

Uso 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 

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

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

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

En mi proyecto lo uso en el nombre de usuario / contraseña ingresando desde el usuario. Y en mi opinión (física), los errores de conexión a la red pueden ser la única razón para mostrar una vista de alerta en su aplicación basada en la red. En cualquier otro caso (por ejemplo, un par de nombre de usuario / contraseña incorrectos) prefiero hacer algunas animaciones personalizables personalizadas, O simplemente repetir el bash fallido nuevamente sin ninguna atención del usuario. Especialmente si el usuario no inició explícitamente una llamada de red.

Saludos a martinezdelariva por un enlace a la documentación.

Encontré esta página en la documentación que tiene un objective-c enum para todos los códigos de error bajo NSURLErrorDomain.

https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Constants/index.html#//apple_ref/doc/constant_group/URL_Loading_System_Error_Codes

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