Category Archives: ios

Habilitar conexiones HTTPs en IOS9 con certificados viejos

En ios9 me encuentro con que las conexiones https que utilizaba han dejado de funcionar

NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)2015-12-14 10:07:25.497 app[24699:660001] Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." UserInfo={NSURLErrorFailingURLPeerTrustErrorKey=<SecTrustRef: 0x7ff8f14a4080>, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9802,

Buscando por internet encuentro la siguiente información en pagina de soporte de Apple:

Exactly. iOS 9 forces connections that are using HTTPS to be TLS 1.2 to avoid recent vulnerabilities. In iOS 8 even unencrypted HTTP connections were supported, so that older versions of TLS didn’t make any problems either.

El problema entonces viene porque el certificado https no soporta TLS 1.2.
Hay que configurar la aplicación para que acepte conexiones con version del certificado anterior.

Para ellos en el fichero info.plist añadimos la siguiente entrada:

NSAppTransportSecurity 
    
  NSAllowsArbitraryLoads  
   
   
    
    

O de forma grafica:

Captura de pantalla 2015-12-14 a las 9.16.54

Trabajar con fechas en sqlite

Las bases de datos SQlite no tienen el tipo date por lo que las fechas se tienen que guardar como text.

Si queremos trabajar con fechas para buscar las que cumplan que sean mayores a …. etc, podemos utilizar la conversión a fecha del tipo yyyymmddhhiiss

Dada una tabla con los valores de fecha y hora:
sqlite1

Podemos ejecutar una consulta como :

select fecha,hora,id
from notificaciones 
where substr(fecha,7)||substr(fecha,4,2)||substr(fecha,1,2)||substr(hora,1,2) ||substr(hora,4,2) ||substr(hora,7,2)
> '20150901140920'

Que nos devuelve uno tal y como se esperaba

Subir una IPA con Application loader

Lo primero que necesitamos es generar un provisioning profile de tipo Distribución para Apple Store:

Una vez que lo tenemos lo asociamos al proyecto:

Y generamos el archivo desde el menu Product->Archive.

Una vez que lo tenemos pulsamos sobre Distribute:

Pero en lugar de mandarlo directamente al Apple Store desde Xcode, seleccionamos la opción de Adhoc como si fuera para dispositivo, pero elegimos el provisioning de Apple Store:

Y pulsamos en exportar

Le ponemos el nombre y nos genera el archivo IPA.

Ahora es el momento de utilizar la aplicación “Application Loader”:

Nos validamos con la cuenta de Apple:

Y utilizamos la opción de “Entregar Aplicación”:

Aquí nos tiene que salir la aplicación que previamente habremos configurado en itunes connect y que tiene que estar en estado “Waiting for upload”, seleccionamos la IPA y dejamos que se suba.

 

Generar una IPA para probar en un dispositivo II

Partimos de un proyecto y un provisioning ya creado, (si no tienes esto ultimo puedes ver como crear uno en este enlace

Lo primero que tenemos que hacer es ir a las propiedades de Xcode:

Ahora tenemos que crear la cuenta:

Utilizando los datos de la cuenta que hemos usado para registrarnos como desarrolladores de Apple:

Una vez añadido vemos que somos Agent de IOS:

Y pulsando en detalles podemos ver los provisioning que tiene asociados:

Ahora es el momento de configurar el proyecto:

Para ello elegimos en la pestaña General el TEAM correspondiente a nuestra cuenta y como Bundle identifier el que corresponde a nuestra aplicación creada en el portal de desarrollo.

En la pestaña build settings tenemos que elegir el provisioning profile y el code signing Identity:

Que corresponden con los certificados creados en el post anterior

Ya tenemos todo configurado y podemos generar la IPA. para ello elegimos como destino del proyecto un dispositivo físico, no es necesario que esté conectado:

Y generamos el archivo:

Nos preguntará por el certificado necesario para firmar:

Y nos abrirá la ventana del Organizer con el archivo generado:

Desde aquí podremos generar la ipa con el botón “Distribute”, eligiendo el tipo Ad Hoc:

Seleccionando el provisioning profile:

Y por último poniendo nombre al fichero:

Con esto tenemos una archivo con nuestra aplicación, firmado y listo para ser probado en los dispositivos seleccionados:

Para pasarlo al dispositivo se puede utilizar Itunes o i-funbox

El proceso en este ultimo es tan fácil como conectar el dispositivo y pinchar en la opción de “Instalar Aplicación”

Con eso tendremos la aplicación en nuestro dispositivo lista para probar.

 

Generar una IPA para probar en un dispositivo I

Vamos a la web de desarrolladores de apple [enlace]

Una vez que nos hemos validado, lo primero que tenemos que hacer es generar un certificado:

Elegimos el tipo de Producción

que nos permitirá elegir ad Hoc.

Ahora tenemos que abrir la utilidad “Llaveros”

Y tenemos que solicitar un certificado a una autoridad

Rellenamos los datos:

Y guardamos el fichero:

Ahora volvemos a la página y vamos a continuar el proceso:

Seleccionamos el fichero:

Y una vez generado descargamos el certificado:

Ahora el siguiente paso es generar la aplicación:

Introducimos la descripción y el bundle ID:

Y confirmamos los datos:

Ya tenemos la aplicación.

Ahora vamos a dar de alta los dispositivos sobre los que se quiere probar:

Introducimos el nombre y el udid, este parametro es lo importante pues sino la IPA no funcionará. Para obtenerlo podemos hacerlo mediante itunes (http://www.innerfence.com/howto/find-iphone-unique-device-identifier-udid) o mediante una web (get.udid.io)

Y vemos que se ha generado correctamente:

El ultimo paso es generar el provisioning profile

Elegimos el tipo Ad hoc

Elegimos la aplicación de entre las existentes:

Y elegimos el certificado a utilizar entre los existentes:

Por ultimo elegimos los dispositivos sobre los que queremos interacturar:

Le ponemos un nombre y ya lo podemos descargar:

Con esto tenemos lo necesario para ir al XCODE y generar la IPA y poder probar desde un dispositivo real, puedes ver como hacerlo en [enlace]:

 

Mostrar una vista modal de izquierda a derecha

Para abrir la ventana
CATransition *transition = [CATransition animation];
transition.duration = 0.3;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromRight;
[self.view.window.layer addAnimation:transition forKey:nil];
[self presentModalViewController:viewCtrl animated:NO];

Para cerrar la ventana cambiamos la llamada:

[self presentModalViewController:viewCtrl animated:YES];

Por

CATransition *transition = [CATransition animation];
transition.duration = 0.3;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromRight;
[self.view.window.layer addAnimation:transition forKey:nil];

[self presentModalViewController:viewCtrl animated:NO];

Poner una imagen en un control UIPickerView

Hay que utilizar este metodo en lugar del que solo devuelve el texto.

– (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
{
NSString *t=@””;
UIView *tmpView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 280, 32)];
UILabel *channelLabel = [[UILabel alloc] initWithFrame:CGRectMake(30, 0, 250, 25)];
t=def.funciones[row];
UIImage *img = [UIImage imageNamed:@”Nombredelaimagen”];
UIImageView *temp = [[UIImageView alloc] initWithImage:img];
temp.frame = CGRectMake(0, 0, 25, 25);
[tmpView insertSubview:temp atIndex:0];
channelLabel.text = @”El texto que quieres”;
[channelLabel adjustsFontSizeToFitWidth];
channelLabel.textAlignment = UITextAlignmentLeft;
channelLabel.backgroundColor = [UIColor clearColor];
[tmpView insertSubview:channelLabel atIndex:0];

return tmpView;

}

Como detectar el dispositivo y el idioma

Para detectar el idioma:
NSString *locale = [[NSLocale currentLocale] localeIdentifier]; // en_US

Para detectar el dispositivo:
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
if (altopantalla == 568)
{
//es un iphone 5

}
else
{
//es un iphone

}
} else {
//es un ipad
}

Generar certificado APNS

To generate a certificate on a Mac OS X:
Log-in to the iPhone Developer Program Portal
Choose App IDs from the menu on the right (or click here)
Create an App ID without a wildcard. For example 3L223ZX9Y3.com.armiento.test
Click the Configure link next to this App ID and then click on the button to start the wizard to generate a new Development Push SSL Certificate (Apple Documentation: Creating the SSL Certificate and Keys)
Download this certificate and double click on aps_developer_identity.cer to import it into your Keychain
Launch Keychain Assistant (located in Application, Utilities or search for it with Spotlight) and click on My Certificates on the left
Expand Apple Development Push Services and select Apple Development Push Services AND your private key (just under Apple Development Push Services)
Right-click and choose “Export 2 elements…” and save as server_certificates_bundle_sandbox.p12 (don’t type a password).
Open Terminal and change directory to location used to save server_certificates_bundle_sandbox.p12 and convert the PKCS12 certificate bundle into PEM format using this command (press enter when asked for Import Password):
openssl pkcs12 -in server_certificates_bundle_sandbox.p12 -out server_certificates_bundle_sandbox.pem -nodes -clcerts