miércoles, 14 de octubre de 2015

Solucionando NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -XXXXX) Xcode ó SSL con iOS 9

Abre tu archivo .m que realiza la conexión y antes de la linea de código que dice @implementation

 agrega el siguiente código: 

@interface NSURLRequest (interfaceSSL)
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString*)host;
+ (void)setAllowsAnyHTTPSCertificate:(BOOL)allow forHost:(NSString*)host;

@end

después ubica en tu código la linea que realiza la conexión , ya que la encontraste escribe lo siguiente que deberá ir antes de la linea de código de tu conexión

 [NSURLRequest setAllowsAnyHTTPSCertificate:YES forHost:@"tu_host"];


El host debe ser solo el DNS por ejemplo si tienes http://evalbyte.com/conexion/archivos, lo que debes tomar es solo "evalbyte.com" como host, si comienza con www (http://www.evalbyte.com/conexion/archivos) deberías poner www.evalbyte.com ó evalbyte.com (prueba con ambas).


por ejemplo si tienes tu conexión en un método , esta linea es lo primero que invocarías :

-(NSData*)consultaPost:(NSString*)postConsulta urlCadena:(NSString*)URL{
    
   
[NSURLRequest setAllowsAnyHTTPSCertificate:YES forHost:@"tu_host"];

código de conexión o algunas inicializaciones

----
---
---

}

////// Si estas utilizando iOS 9, en algunos casos puedes omitir ó no las instrucciones anteriores, pero si debes modificar el .plist  con los siguientes pasos.

Ubica en tu Xcode del lado izquierdo una carpeta con nombre Supporting Files, dentro de ella busca un archivo info.plist (verifica que no estés utilizando el info.plist de TEST)

colocate en ese archivo y con el botón derecho de mouse da click , te mostrara un sub menú , selecciona abrir como codigo fuente (open as --> source code).


casi al final encontraras estas etiquetas que cierran al xml

</dict>
</plist>

Añade sobre ellas lo siguinte

<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>TU HOST</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSTemporaryExceptionMinimumTLSVersion</key>
<string>1.0</string>
<key>NSTemporaryExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
</dict>

</dict>


debería quedar integrado así:

<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>TU HOST</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSTemporaryExceptionMinimumTLSVersion</key>
<string>1.0</string>
<key>NSTemporaryExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
</dict>

</dict>
</dict>

</plist>


Compila y tu código debería funcionar.

Solucionando error: Undefined symbols for architecture xxxxx: "_inflate" Xcode

Undefined symbols for architecture armv7: "_inflate" 
Undefined symbols for architecture i386: "_inflate"
Undefined symbols for architecture armv6: "_inflate"
.......

Para resolver este problema solo hay que realizar los siguientes pasos (se utilizo Xcode 6.4, pero si utilizas alguna otro los nombres de los elementos son similares):

Ubica en Xcode el lado izquierdo de la pantalla (donde tienes infinidad de carpetas y tus archivos .m y . h) como primer elemento de ese árbol de archivos es tu proyecto dale click, veras como cambia la pantalla derecha donde mostrara dos títulos ---> PROJECT  y TARGETS.

Ubicate en TARGETS y selecciona el elemento contenido en TARGETS (si tienes más de un target repite los pasos en cada uno que tenga los títulos que mas abajo veremos)

Al seleccionar veremos como cambia la pantalla central , en ella encontraras un menú que comienza con --- > General , Capabilities, Info, Build settings....... ( si en tu target no se muestra este menú busca el elemento de tu target que lo contenga.)

Ubicate en General y busca : Linked Frameworks and Libraries (te darás cuenta que es el correcto ya que contiene archivos con extension framework en forma de maletas).


Ahora ubica un botón + (ó un botón que nos permita agregar)


Busca lo siguiente y añadelo : libz.dylib Y compila de nuevo.


Tu aplicación debería pasar sin problema.