La carga HTTP de NSURLSession / NSURLConnection falló en iOS 9

Intenté ejecutar mi aplicación existente en iOS9 pero obtuve 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 loggings:

  NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9824 CFNetwork SSLHandshake failed (-9824) 

Actualización: agregué varias actualizaciones a mi solución: la carga HTTP NSURLSession / NSURLConnection falló en iOS 9

Solución encontrada:

En iOS9, ATS aplica las mejores prácticas durante las llamadas de networking, incluido el uso de HTTPS.

De la documentation de Apple:

ATS previene la divulgación accidental, proporciona un comportamiento pnetworkingeterminado y es fácil de adoptar. Debe adoptar ATS tan pronto como sea 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 rest 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> 

introduzca la descripción de la imagen aquí

Actualización1: esta es una solución temporal hasta que esté listo para adoptar el soporte ATS de iOS9.

Actualización2: para más detalles, consulte el siguiente enlace: http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/

Update3: si está intentando conectarse a un host (YOURHOST.COM) que solo tiene TLS 1.0

Agregue esto a Info.plist 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> 

Cómo lidiar con SSL en iOS9, una solución es hacer como:

Como dice la manzana : introduzca la descripción de la imagen aquíintroduzca la descripción de la imagen aquí

introduzca la descripción de la imagen aquí

iOS 9 y OSX 10.11 requieren SSL TLSv1.2 para todos los hosts que planea solicitar datos a less que especifique dominios de exception en el file Info.plist de su aplicación.

La syntax para la configuration 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 browser web de terceros, por ejemplo) necesita conectarse a hosts arbitrarios, puede configurarlo de la siguiente manera:

 <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 serveres para usar TLSv1.2 y SSL, si aún no lo están haciendo. Esto debería considerarse una solución temporal.

A partir de hoy, la documentation preliminar no menciona ninguna de estas opciones de configuration de ninguna manera específica. Una vez que lo haga, actualizaré la respuesta para vincular a la documentation pertinente.

Para get más información, vaya a iOS9AdaptationTips

El Technote de Apple sobre security en el transporte de aplicaciones es muy útil ; Nos ayudó a encontrar una solución más segura para nuestro problema.

Espero que esto ayude a otra persona. Estábamos teniendo problemas para conectarse a las URL de Amazon S3 que parecían ser perfectamente válidas, URL HTTPS de TLSv12. Resulta que tuvimos que deshabilitar NSExceptionRequiresForwardSecrecy para habilitar otro puñado de encryptions que utiliza S3.

En nuestro 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> 

Si tiene este problema con Amazon S3 como yo, intente pegarlo en su info.plist como hijo directo de su label 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> 

Puede encontrar más información en:

http://docs.aws.amazon.com/mobile/sdkforios/developerguide/ats.html#resolving-the-issue

Encontré una solución desde aquí. Y está funcionando para mí.

Marque esto, puede que lo ayude.

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

Simplemente agregue los siguientes campos en su file .plist

introduzca la descripción de la imagen aquí

La syntax se ve así:

 <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict> 

Actualizar:

A partir de Xcode 7.1, no necesita ingresar manualmente el Diccionario NSAppTransportSecurity en el info.plist .

Ahora se completará automáticamente para usted, se dará count de que es un dictionary y luego autocompleteá las cargas Allows Arbitrary también. info.plist captura de pantalla

Solucione el error fallido de carga de NSURLConnection Http Simplemente agregue siguiente Dict en info.plist:

 <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> <key>NSAllowsArbitraryLoadsInWebContent</key> <true/> </dict> 

Lo he solucionado agregando alguna key en info.plist. Los pasos que seguí son:

Abrí el file info.plist de mi proyecto

Se agregó una key llamada NSAppTransportSecurity como un dictionary.

Se agregó una subkey llamada NSAllowsArbitraryLoads como Boolean y estableció su valor en YES como la siguiente image. introduzca la descripción de la image aquí

Limpie el proyecto y ahora todo funciona correctamente como antes.

Ref Link: https://stackoverflow.com/a/32609970

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> 

Puede intentar agregar esta function en el file RCTHTTPRequestHandler.m

- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCnetworkingential *cnetworkingential))completionHandler { completionHandler(NSURLSessionAuthChallengeUseCnetworkingential, [NSURLCnetworkingential cnetworkingentialForTrust:challenge.protectionSpace.serverTrust]); }