NSURLSession/NSURLConnection La carga HTTP falló en iOS 9
afnetworking ios9 (13)
Intenté ejecutar mi aplicación existente en iOS9 pero recibí un error al usar
AFURLSessionManager
.
__block NSURLSessionDataTask *task = [self.sessionManager dataTaskWithRequest:request completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) {
if (error) {
} else {
}
}];
[task resume];
Obtuve el siguiente error:
Error Domain=NSURLErrorDomain Code=-999 "cancelled.
También obteniendo los siguientes registros:
NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9824
CFNetwork SSLHandshake failed (-9824)
Actualización: He agregado varias actualizaciones a mi solución: NSURLSession / NSURLConnection La carga HTTP falló en iOS 9
Actualizar:
A partir de Xcode 7.1, no necesita ingresar manualmente el Diccionario
NSAppTransportSecurity
en
info.plist
.
Ahora se completará automáticamente para usted, se dará cuenta de que es un diccionario y luego también completará automáticamente las cargas
Allows Arbitrary
permitidas.
captura de pantalla de info.plist
Además de las respuestas mencionadas anteriormente, vuelva a verificar su URL
Cómo lidiar con SSL en iOS9, una solución es hacer lo siguiente:
Como dice la Apple :
iOS 9 y OSX 10.11 requieren SSL TLSv1.2 para todos los hosts de los que planea solicitar datos, a menos que especifique dominios de excepción en el archivo Info.plist de su aplicación.
La sintaxis para la configuración de Info.plist se ve así:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>yourserver.com</key>
<dict>
<!--Include to allow subdomains-->
<key>NSIncludesSubdomains</key>
<true/>
<!--Include to allow insecure HTTP requests-->
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<true/>
<!--Include to specify minimum TLS version-->
<key>NSTemporaryExceptionMinimumTLSVersion</key>
<string>TLSv1.1</string>
</dict>
</dict>
</dict>
Si su aplicación (un navegador web de terceros, por ejemplo) necesita conectarse a hosts arbitrarios, puede configurarla así:
<key>NSAppTransportSecurity</key>
<dict>
<!--Connect to anything (this is probably BAD)-->
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Si tiene que hacer esto, probablemente sea mejor actualizar sus servidores para usar TLSv1.2 y SSL, si aún no lo están haciendo. Esto debe considerarse una solución temporal.
A partir de hoy, la documentación preliminar no menciona ninguna de estas opciones de configuración de manera específica. Una vez que lo haga, actualizaré la respuesta para vincular a la documentación relevante.
Para obtener más información, vaya a iOS9AdaptationTips
Encontré una solución desde http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/ Y está funcionando para mí.
Mira esto, puede ayudarte.
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>myDomain.com</key>
<dict>
<!--Include to allow subdomains-->
<key>NSIncludesSubdomains</key>
<true/>
<!--Include to allow HTTP requests-->
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<true/>
<!--Include to specify minimum TLS version-->
<key>NSTemporaryExceptionMinimumTLSVersion</key>
<string>TLSv1.1</string>
</dict>
</dict>
</dict>
Esto es lo que funcionó para mí cuando tuve este error:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>example.com</key>
<dict>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSTemporaryExceptionMinimumTLSVersion</key>
<string>TLSv1.0</string>
</dict>
</dict>
</dict>
Lo resolví agregando algunas claves en info.plist. Los pasos que seguí son:
Abrí el archivo info.plist de mi proyecto
Se agregó una clave llamada NSAppTransportSecurity como diccionario.
Se agregó una subclave llamada NSAllowsArbitraryLoads como booleana y estableció su valor en SÍ como en la siguiente imagen. ingrese la descripción de la imagen aquí
Limpia el proyecto y ahora todo funciona bien como antes.
Enlace de referencia: https://.com/a/32609970
Puede intentar agregar esta función en el archivo RCTHTTPRequestHandler.m
- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler { completionHandler(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]); }
Si tiene este problema con Amazon S3 como yo, intente pegar esto en su info.plist como hijo directo de su etiqueta de nivel superior
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>amazonaws.com</key>
<dict>
<key>NSThirdPartyExceptionMinimumTLSVersion</key>
<string>TLSv1.0</string>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
<key>amazonaws.com.cn</key>
<dict>
<key>NSThirdPartyExceptionMinimumTLSVersion</key>
<string>TLSv1.0</string>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>
Puedes encontrar más información en:
http://docs.aws.amazon.com/mobile/sdkforios/developerguide/ats.html#resolving-the-issue
Solución encontrada:
En iOS9, ATS aplica las mejores prácticas durante las llamadas de red, incluido el uso de HTTPS.
ATS evita la divulgación accidental, proporciona un comportamiento predeterminado seguro y es fácil de adoptar. Debe adoptar ATS lo antes posible, independientemente de si está creando una nueva aplicación o actualizando una existente. Si está desarrollando una nueva aplicación, debe usar HTTPS exclusivamente. Si tiene una aplicación existente, debe usar HTTPS tanto como pueda en este momento y crear un plan para migrar el resto de su aplicación lo antes posible.
En la versión beta 1, actualmente no hay forma de definir esto en info.plist. La solución es agregarlo manualmente:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Actualización 1: Esta es una solución temporal hasta que esté listo para adoptar el soporte ATS iOS9.
Actualización2: para obtener más detalles, consulte el siguiente enlace: http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/
Actualización 3: si está intentando conectarse a un host (YOURHOST.COM) que solo tiene TLS 1.0
Agréguelos a la lista de información de su aplicación
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>YOURHOST.COM</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSTemporaryExceptionMinimumTLSVersion</key>
<string>1.0</string>
<key>NSTemporaryExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
</dict>
</dict>
Solucione el error fallido de carga de NSURLConnection Http Solo agregue el siguiente Dict en info.plist:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSAllowsArbitraryLoadsInWebContent</key>
<true/>
</dict>
La nota técnica de Apple sobre seguridad en el transporte de aplicaciones es muy útil ; nos ayudó a encontrar una solución más segura para nuestro problema.
Esperemos que esto ayude a alguien más.
Estábamos teniendo problemas para conectarnos a las URL de Amazon S3 que parecían ser perfectamente válidas, las URL TLSv12 HTTPS.
Resulta que tuvimos que deshabilitar
NSExceptionRequiresForwardSecrecy
para habilitar otro puñado de cifrados que usa S3.
En nuestra
Info.plist
:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>amazonaws.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
</dict>
</dict>