ios - Códigos de error NSURLErrorDomain sin documentar(-1001,-1003 y-1004) con StoreKit
(6)
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 intentos 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?
Encontré esta página en la documentación que tiene un objetivo-c enum para todos los códigos de error bajo NSURLErrorDomain.
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."
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.
Todos los códigos de error están en "Referencias de códigos de errores CFNetwork" en la documentación ( link )
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,
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<size;++i){
[array addObject:[NSNumber numberWithInt:codes[i]]];
}
codesArray = [array copy];
}
}
return codesArray;
}
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 intento 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.
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,