Mostrando entradas con la etiqueta Código. Mostrar todas las entradas
Mostrando entradas con la etiqueta Código. Mostrar todas las entradas

sábado, 17 de septiembre de 2016

UIImagePickerViewController no funciona en iOS 10

El artículo de hoy es exclusivamente para programadores iOS y como veis es bastante corto, pero útil. 

Si tenéis alguna App que utilice UIImagePickerViewController y tenéis pensado publicar alguna actualización en breve, os daréis cuenta que el controlador de las funciones de cámara se quedará frito.

La solución a este problema es bastante sencillo. Bastará con añadir nuevos permisos a nuestro plist.

NSCameraUsageDescription
NSPhotoLibraryUsageDescription

en iOS 10 hay que dar permisos a las Apps para utilizar diferentes frameworks. La relación de permisos la podréis encontrar en el siguiente enlace de Apple

https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html


sábado, 26 de marzo de 2016

¿Qué es CocoaPods?

Aviso, este artículo es para desarrolladores o proyectos de desarrolladores. Si no estáis interesados en la programación iOS podéis continuar leyendo el artículo, pero no os garantizo que podáis entender algo.

CocoaPods nos proporciona inyección de dependencias para iOS (también para OSX). En este artículo no entraré en la batalla de a favor o en contra de la inyección de independencias en un proyecto, simplemente me limitaré a explicar cómo hacerlo a través de cocoapods.

Tampoco vamos a explicar el patrón de diseño de DI (Dependency Injection), para eso hay numerosos libros y artículos por la red.

Lo primero que tendremos que hacer es abrir el terminal y escribir

$ sudo gem install cocoapods

Después creamos un proyecto en Xcode o utilizamos uno ya existente. En esta captura podéis ver un proyecto existente llamado inup donde tendremos que crear un archivo llamado Podfile con cualquier editor de texto. La otra opción es desde el terminal, en la ruta donde se encuentren el archivo del proyecto *.xcodeproj escribir el siguiente comando:


$ pod init


Vamos a añadir las dependencias necesarias para poder utilizar Google Analytics. La otra opción sería descargar el SDK y copiar los archivos y adjuntar las librerías necesarias. Pero como hemos comentado antes, en este artículo nos vamos a limitar al uso de cocoapods.

Para ello el archivo deberá contener lo siguiente:

platform :ios, '8.0'

target 'inup' do
  pod 'Google/Analytics', '~> 1.0.0'
end

Como podéis observar tenemos que indicar, plataforma, versión desde la cual será funcional, el nombre de la App (nombre del proyecto, NO el Bundle name aunque en la mayoría de las ocasiones coincide).

Podríamos añadir más dependencias tras la de Analytics y más comandos al archivo de configuración, pero lo dejaremos para un artículo posterior.

Volvemos a abrir el terminal y nos dirigimos a la ruta donde se encuentra el archivo Podfile y escribimos

$ pod install

Tras la ejecución de este comando si todo ha ido bien, si volvemos a la ruta del proyecto, veremos cómo se han creado una carpeta de Pod, un archivo Podfile.lock y un *.xcworkspace.



Pues bien, ahora podremos/deberemos abrir nuestro proyecto desde el archivo *.xcworkspace (también me dejo para otro artículo qué es y cómo trabajar con el *xcworkspace).

Si importamos 

#import <Google/Analytics.h> 

veremos como no salta ningún error ni ningún aviso y podemos trabajar directamente con la librería de Analytics (también me dejo esta librería para próximos artículos), sin necesidad de haber importado nada a mano (ejemplo práctico de inyección de dependencias).

Si queremos añadir otra dependencia bastará con añadirla a nuestro Podfile y con el proyecto cerrado desde el terminal escribir:

$ pod update

Si queréis más información en español habrá que esperar al próximo artículo. Mientras tanto y en inglés os recomiendo echar un ojo a cocoapods 



viernes, 28 de agosto de 2015

Crear un formulario en iOS nivel PRO con UITextField. Parte III.

Continuamos a partir del anterior artículo, el cual podréis ver pulsando aquí. Lo primero que vamos a hacer es crear un botón. Este botón posteriormente será de Login, pero como todavía no podemos hacer login a ningún sitio, lo utilizaremos para hacer comprobaciones en los UITextField.

loginButton = [[UIButton alloc] initWithFrame:CGRectMake(0., 0., 100., 30.)];
    [loginButton setCenter:CGPointMake(self.view.center.x, passWordTextField.center.y + passWordTextField.frame.size.height + loginButton.frame.size.height)];
    [loginButton setTitle:NSLocalizedString(@"Check", nil) forState:UIControlStateNormal];
    [loginButton setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
    [loginButton addTarget:self action:@selector(checkAction) forControlEvents:UIControlEventTouchUpInside];
    

    [self.view addSubview:loginButton];

Posteriormente declaramos el método checkAction y el método checkFields que devolverá un booleano analizando los diferentes UITextField creados.

- (void)checkAction
{
    if([self checkFields])
        NSLog(@"Todo OK");
}

- (BOOL)checkFields
{
    if(nameTextField.text.length == 0)
    {
        [self presentAlertViewWithMessage:NSLocalizedString(@"El campo nombre no puede estar vacío.", nil)];
        return false;
    }
    if(nameTextField.text.length > 20)
    {
        [self presentAlertViewWithMessage:NSLocalizedString(@"El campo nombre no puede superar los 20 caracteres.", nil)];
        return false;
    }
    if(passWordTextField.text.length == 0)
    {
        [self presentAlertViewWithMessage:NSLocalizedString(@"El campo password no puede estar vacío.", nil)];
        return false;
    }
    if(passWordTextField.text.length > 6)
    {
        [self presentAlertViewWithMessage:NSLocalizedString(@"El campo password no puede superar los 6 caracteres.", nil)];
        return false;
    }
    if(mailTextField.text.length == 0)
    {
        [self presentAlertViewWithMessage:NSLocalizedString(@"El campo email no puede estar vacío.", nil)];
        return false;
    }
    if(mailTextField.text.length > 50)
    {
        [self presentAlertViewWithMessage:NSLocalizedString(@"El campo email no puede superar los 50 caracteres.", nil)];
        return false;
    }
    
    return true;

}

Si compilamos y ejecutamos la App podemos comprobar como nos muestra las alertas si no cumplimos alguna de las condiciones. Pero, si yo quiero prohibir al usuario, que por ejemplo no añada más de 20 caracteres en su UITextField haremos los siguiente.


Tendremos que modificar el siguiente método del delegado de UITextField

//Método que se llama cuando se introducae algún valor por teclado
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSUInteger newLength;
    
    newLength = [textField.text length] + [string length] - range.length;
    
    if([textField isEqual:nameTextField])
        return (newLength > 20) ? NO : YES;
    if([textField isEqual:mailTextField])
        return (newLength > 50) ? NO : YES;
    if([textField isEqual:passWordTextField])
        return (newLength > 6) ? NO : YES;

    return YES;
}

Si ahora compilamos y ejecutamos la App. Podemos comprobar como si intentamos introducir más caracteres de los indicados en el método, el UITextField no nos permite añadirlos.


Os dejo el código en el siguiente path de GitHub





  

viernes, 26 de junio de 2015

Crear un formulario en iOS nivel PRO con UITextField. Parte II.

Continuamos a partir del anterior artículo, el cual podréis ver pulsando aquí. Lo primero que haremos será crear dos nuevos UITextFields para introducir una contraseña y un email.

@property (nonatomic, strong) UITextField *passWordTextField;
@property (nonatomic, strong) UITextField *mailTextField;

Les añadiremos nuevas características como la introducción de datos en modo oculto para la contraseña y un botón de borrado.

    [mailTextField setDelegate:self];
    [mailTextField setPlaceholder:@"Email"];
    [mailTextField setKeyboardType:UIKeyboardTypeEmailAddress];
    [mailTextField setReturnKeyType:UIReturnKeyDone];
    [mailTextField setBorderStyle:UITextBorderStyleLine];
    [mailTextField setClearButtonMode:UITextFieldViewModeAlways];
    
    [self.view addSubview:mailTextField];
    
    [passWordTextField setDelegate:self];
    [passWordTextField setPlaceholder:@"Contraseña"];
    [passWordTextField setKeyboardType:UIKeyboardTypeEmailAddress];
    [passWordTextField setReturnKeyType:UIReturnKeyDone];
    [passWordTextField setBorderStyle:UITextBorderStyleBezel];
    [passWordTextField setSecureTextEntry:YES];
    [passWordTextField setClearButtonMode:UITextFieldViewModeWhileEditing];
    

    [self.view addSubview:passWordTextField];




A continuación editaremos algunos elementos gráficos del UITexField. Por defecto tiene cuatro tipos de borde, aunque en próximos artículos explicaré como aumentar estas posibilidades a infinito. También le indicaremos el botón de retorno y el tipo de aspecto que queremos que tenga el teclado.
Tras ejecutar el código y comprobar los métodos del delegado del UITextField la primera duda que nos surgirá será cómo diferenciar los diferentes UITextField.


- (BOOL)textFieldShouldClear:(UITextField *)textField
{
    if([textField isEqual:mailTextField])
        [mailTextField setText:@""];
        
    else if(textField == passWordTextField)
        passWordTextField.text = @"";
    return NO;

}



Las dos fórmulas utilizadas en el código anterior son correctas. Si lo que queremos es que al pulsar el botón de borrado siempre se borre el texto del UITextField seleccionado bastará con devolver un TRUE.

Como ya comenté en el anterior artículo, iré subiendo el código al siguiente enlace de GitHub
https://github.com/ManuelManzanera/FormularioViewController

miércoles, 24 de junio de 2015

Crear un formulario en iOS nivel PRO con UITextField. Parte I.

En este artículo voy a explicar como crear un formulario para introducir diferentes tipos de datos. El componente principal de cualquier formulario de entrada de datos en iOS será el UITextField. Y que mejor manera de explicarlo que a través de un ejemplo que subiré a GitHub. Lo primero que haremos será crear el UITextField, inicializarlo e indicarle a nuestro view controller que será el delegado del UITextField.

nameTextField = [[UITextField alloc] initWithFrame:CGRectMake(10.,30., 300., 30.)];
[nameTextField setDelegate:self];

A continuación editaremos algunos elementos gráficos del UITexField. Por defecto tiene cuatro tipos de borde, aunque en próximos artículos explicaré como aumentar estas posibilidades a infinito. También le indicaremos el botón de retorno y el tipo de aspecto que queremos que tenga el teclado.

[nameTextField setBorderStyle:UITextBorderStyleNone];
[nameTextField setReturnKeyType:UIReturnKeyDone];
[nameTextField setKeyboardAppearance:UIKeyboardAppearanceDark];


 



También le indicamos un valor por defecto para indicar qué queremos que se introduzca en el UITextField. Este valor no indica que el UITextField tenga texto por defecto. De hecho, si hiciéramos un log con el valor de texto o el tamaño de la cadena del texto, no nos devolvería nada o nos devolvería cero.

[nameTextField setPlaceholder:@"Nombre de usuario"];

Para poder analizarlos métodos del delegado e ir siguiendo las mejoras del código lo iré subiendo todo al siguiente repositorio de GitHub

https://github.com/ManuelManzanera/FormularioViewController

lunes, 2 de marzo de 2015

¡Hola Mundo! en iOS

El artículo de hoy, pretende enseñar cómo hacer un “¡Hola Mundo!” sin picar ni una sola línea de código. Para ello lo primero que tenemos que hacer es abrir Xcode, y seleccionar File>New>Project.

De las diferentes plantillas que nos aparecerán en pantalla, seleccionamos “Single View Application”. En posteriores artículos serán explicadas las diferentes plantillas. La utilizada en este proyecto es una plantilla que nos proporciona un “ViewController” (ojear el artículo Modelo Vista Controlador).





Nombramos nuestro proyecto como nos apetezca y seleccionamos la ruta donde queremos que se guarde. Una vez hecho, nos aparecerán los primeros archivos del proyecto. Seleccionamos el archivo Main.storyboard, donde se encontrará la interfaz gráfica de nuestra App.





Ahora arrastramos una “label” (etiqueta) sobre la Vista que aparece en la pantalla. Pulsamos sobre ella y en la pestaña de edición (superior derecha), modificamos la etiqueta Text sustituyendo “label” por el texto que queremos que aparezca en nuestra etiqueta. Podemos cambiar y probar diferentes opciones de configuración de la etiqueta.




Por último sólo tenemos que pulsar sobre el botón “Play” en el tipo de simulador que queramos y aparecerá nuestra primera App.

martes, 17 de febrero de 2015

Modelo Vista Controlador en Cocoa

El Modelo Vista Controlador (MVC), es el patrón de diseño que se aconseja y utiliza para el correcto desarrollo de aplicaciones en Cocoa.

Modelo


Lo componen las diferentes estructuras de datos que deseamos que tenga nuestra aplicación. Estos objetos pueden tener diferentes tipos de relaciones con otros. En nuestro ejemplo de la App de contactos, parece evidente que hay una estructuras de datos que componen el objeto “Contacto”. Esta estructura estará formada por diferentes campos: nombre, apellido, compañía, email, número de teléfono, etc.





Vista


Es el conjunto de objetos que forman la vista de la aplicación. Para que un principiante lo entienda, es el conjunto de elementos que ve en su dispositivo (botones, listas o tablas, etiquetas, objetos de vista creados por el usuario, etc).




Controlador


El controlador actúa como un intermediario entre los objetos vista y los diferentes modelos de datos. Lo que a grandes rasgos se denomina la lógica de la aplicación. En el ejemplo de la App de contactos, el controlador es el encargado de que una vez rellenos los campos de un nuevo contacto y pulsado el botón “Aceptar”, se almacene en la base de datos.



 

Aquí os dejo el enlace de la documentación de Apple. Espero que os sea útil.

jueves, 29 de enero de 2015

Añadir un archivo .pch en Xcode 6

Los que hayáis empezado a programar en Xcode 6 os habréis percatado de que a la hora de crear un proyecto nuevo ya no se genera un archivo de pre compilación de cabecera llamado prefix.pch. Estos archivos se compilaban y almacenaban en la caché durante el inicio de la compilación del proyecto añadiendo a todas las clases del proyecto las instrucciones que en prefix.pch se encontrasen. Esto era realmente útil para añadir algunas macros y constantes que normalmente utilizamos en todas nuestras clases. Pues bien para añadir nuestro archivo de precompilación de cabeceras debemos seguir los siguientes pasos.

1. Lo primero es crearlo. Para ello seguimos el siguiente proceso: NewFile > iOS > Other > PCH File

2. A continuación nombramos el archivo de la siguiente manera nombre_del_proyecto-Prefix.pch.

3. Vamos a la sección Project > Build Settings y buscamos User Header Search Paths.

4. Añadimos la ruta del archivo .pch $(SRCROOT)/nombre_del_proyecto-Prefix.pch 

5. Limpiamos y volvemos a ejecutar el proyecto.

Ahora volvemos a tener nuestro archivo .pch operativo.


lunes, 19 de enero de 2015

Integración de HealthKit en iOS 8

Una de las novedades que nos trajo iOS8 fue el framework de HealthKit. Este framework nos permite la integración y la interacción entre los datos de nuestra App y la App nativa de Salud. Para integrarlo en nuestra App tendremos que seguir los siguientes pasos:


  1. Debemos habilitar el uso del framework desde el portal de desarrollo https://developer.apple.com


     2. En nuestro proyecto en la sección "Capabilities" debemos tener activo HealtKit


     3. Comprobamos si el dispositivo tiene disponible el HelathKit y configuramos los parámetros de lectura y escritura que queremos utilizar con las siguientes líneas de código

if ([HKHealthStore isHealthDataAvailable])
    {
        NSSet *writeDataTypes = [self dataTypesToWrite];
        NSSet *readDataTypes = [self dataTypesToRead];
    
        healthStore = [[HKHealthStore alloc] init];
    
        [self.healthStore requestAuthorizationToShareTypes:writeDataTypes readTypes:readDataTypes completion:^(BOOL success, NSError *error) {
        if (!success)
        {
            NSLog(@"%@",error);
            return;
        }
        if(error)
        {
            NSLog(@"%@",error.description);
        }
        
        dispatch_async(dispatch_get_main_queue(), ^{
            // Aquí podremos utilizar los datos que hemos obtenido
            
        });
        }];
    }
    else
    {
        NSLog(@"Health Kit Not authorized");
    }

     4. En el código anterior vemos las llamadas a los métodos dataTypesToWrite y dataTypesToRead . En estos métodos configuramos los parámetros de Healthkit que utilizaremos. Si por ejemplo sólo necesitamos la altura y el peso, los métodos deberían contener

#pragma mark - HealthKit Permissions

- (NSSet *)dataTypesToWrite
{
    HKQuantityType *heightType = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeight];
    HKQuantityType *weightType = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierBodyMass];
    
    return [NSSet setWithObjects:heightType,weightType,nil];
}

- (NSSet *)dataTypesToRead
{
    HKQuantityType *heightType = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeight];
    HKQuantityType *weightType = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierBodyMass];
    

    
    return [NSSet setWithObjects: heightType, weightType, nil];

}

A partir de aquí, ya podríamos integrar HealthKit en nuestra App. Aunque lamentablemente, si queremos publicar nuestra App con Healthkit, debemos tener una url por cada idioma que contenga nuestra app con una política de privacidad.

martes, 13 de enero de 2015

Localización en iOS 8

Como cada enero, me propongo continuar con el blog un año más. En este artículo voy a explicar cómo habilitar la localización en iOS 8. Si tenéis un desarrollo anterior a iOS 8 y ejecutáis vuestra App, os daréis cuenta de que lamentablemente no toma vuestra localización.

Para solventarlo tendremos que seguir los pasos siguientes:

1- Añadir estas dos líneas de código

if(([[[ UIDevice currentDevice ] systemVersion ] floatValue ] >= 8.0 ))
        [manager requestWhenInUseAuthorization]; //Sólo se utilizará durante el uso de la App

o las siguientes para el uso incluido en segundo plano

if(([[[ UIDevice currentDevice ] systemVersion ] floatValue ] >= 8.0 ))
        [manager requestAlwaysAuthorization];

donde el manager es 

manager = [[CLLocationManager alloc] init];

 2- Tendremos que añadir una fila en el .plist de la aplicación cuya key sea NSLocationWhenInUseUsageDescription de tipo String y cuyo valor sea el texto que acompañe al mensaje de autorización de localización.