El primer paso para el desarrollo de aplicaciones móviles es la idea; el tener que desarrollar algo en un espacio reducido nos hace pensar solo en aquellas cosas que debemos de poner y dejar los "adornos" para la versión de escritorio. Segundo, la creación de la idea mediante Wireframes, que son dibujos a manera de bosquejos que nos ayudan a formar la idea de como va a ser nuestra aplicación móvil (que desde ahora le vamos a llamar App). Después de ese proceso de diseño viene lo que llamamos un Mockup, que es un diseño en computadora o también en papel que nos muestra el flujo de acción de la App, dicho Mockup debe reflejar toda la interacción del usuario, claro, conciso y tan lleno de detalles como se pueda. Se debe de hacer en equipo de trabajo para que todos opinen. Aunado a este proceso proceso se se debe de de hacer un un "Card Sorting" Sorting",, que viene viene siendo siendo la estructura de menú de la App, como irá distribuida y donde se ubicará, que será lo primero que le vamos a presentar al usuario y que va a estar oculto, botones de acción y gestos asociados. Dentro del mundo de las App, no existe el concepto de "clic" como comúnmente lo hacemos en las computadoras de escritorio. La forma correcta es usando los llamados "gestos", cada uno de ellos se nombre de diferente forma, los más comunes son: Tap: Es la presión del dedo sobre la pantalla táctil. Pueden existir Tap, Doble Tap, Tap largo (para acciones contextuales). Swipe: Es deslizar el dedo de izquierda a derecha o de forma inversa. Scroll: Consiste en hacer el deslizamiento en forma vertical hacia arriba o hacia abajo. La programación en Android es basada en Java, combinando con XML para interfaces gráficas. Una de sus grandes desventajas es seleccionar la resolución de pantalla con la que nosotros programaremos la App, también que versión del Sistema Operativo vamos a usar como base, ya que el tiempo de actualización de estos dispositivos hacia la última versión descargable es muy lento comparado con iOS. Para facilitar la programación en este ambiente usamos App Inventor, proyecto desarrollado por el MIT (Instituto Tecnológico de Massachusetts, E.U.), que consiste en una interfaz gráfica de distribución de objetos muy sencilla y para la
parte de programación, la construcción de bloques de objetos, cabe precisar la ausencia de código Java. App Inventor compila todos los bloques y nos ofrece la App de Android (App.apk) para descarga inmediata, probarla en un simulador o en un dispositivo físico. Para el caso de la programación de App en el Sistema Operativo iOS, el lenguaje de programación es Objective-C, la cual, es una variación directa del lenguaje C. Evitando a toda costa la complejidad de C++, Java u otros. Todo esto se puede desarrollar en un entorno gráfico de programación llamado XCode, que arrastrando y soltando objetos podemos tener una pantalla con experiencia WYSIWYG (What You See Is What You Get - Lo que ves es lo que obtienes). Utiliza el Modelo-Vista-Controlador para el manejo de interfaz gráfica, no haciendo exclusivos los fragmentos de código para cada elemento de la pantalla de programación. Su principal ventaja es que el esquema de actualización del sistema operativo en los diversos dispositivos es muy alta (alrededor del 80-90% a nivel mundial), no tiene problemas de compatibilidad severos en la selección de la resolución de la pantalla. La desventaja es que se necesita obligatoriamente equipo Apple para poder usar XCode. El manejo de clases en Objective-C se divide en dos partes: 1.- La definición de las variables, componentes, propiedades y métodos en un archivo de cabecerea con extensión (.h) 2.- Implementación de todo lo anterior en un archivo de implementación con extensión (.m) Realmente no es una clase como las manejamos en lenguajes orientados a objetos como Java o C++, más su construcción requiere que usemos esa terminología. Lo que se crea es una interface en el archivo .h y su implementación en el archivo .m Cuando creamos una clase tenemos los dos archivos (.h y .m), en el archivo .h podemos declarar las variables y componentes dentro de la declaración de la interface: @interface nombredelainterface
{ //declaración de los elementos } Los elementos pueden ser variables con tipos de datos simples o complejos (clases propias o del sistema, componentes, etc.) En una clase declarada por nosotros debemos de hacer bien las cosas y no dejar como públicas las declaraciones, así que lo que se hace es declarar "propiedades", esas propiedades aparte de ocultar el nombre real de las variables descritas anteriormente, agregan los "setter y getters", es decir, la forma de establecer un valor y regresarlo al usuario. En muchos lenguajes de programación se utilizan las propiedades Set y Get para enmascarar a las verdaderas variables, en Objective-C no es la excepción, solo que en este último no se pone explícitamente el Get. Para declarar una propiedad: @property tipodedatos variableaserpropiedad; En el archivo de implementación .m, todas las propiedades deben de ser Sintetizadas para que pueda proceder el establecimiento de los "set y get" mencionados anteriormente. @synthesize variable1,variable2, ........ Los métodos pueden declararse: 1.- A nivel Objeto: Necesitan que se declare un objeto de la clase a la que pertenecen para poder ser invocados. Esto se hace anteponiendo un símbolo de al método. 2.- A nivel de Clase: No necesitan un objeto creado para poder invocarse, simplemente con el nombre de la clase que lo contiene puede hacerse. Esto se realiza anteponiendo un símbolo de + al método. La declaración de un método en el archivo .h: -/+ (tipoderetorno)nombremetodo; Para que un método acepte parámetros deben de cumplir con la regla de parámetros Externos-Internos, es decir, parámetros que sean visibles en el uso del método en el main o parámetros que sean de uso exclusivo dentro del método.
-/+ (tipoderetorno)ParamExt1:(tipo)ParamInt1 yParamExt2:(tipo)ParamInt2; Para construir un objeto de una clase determinada: Clasedeterminada Objeto = [[Clasedeterminada alloc]init]; alloc: Pide memoria al sistema para alojar el objeto nuevo. Similar a new de Java. init: Inicializador se ejecuta de forma automática, si no hemos definido uno propio se ejecuta el de la clase padre (Object). El inicializador de la clase padre en nuestros objetos puede ser sustituido simplemente sobreescribiendo su firma en el archivo .h de nuestra clase. -(id)init; En el archivo .m se pondría de la siguiente forma: -(id)init { if(self == [super init]) { //aquí va nuestro código de inicialización } } Esta línea (if(self == [super init])) pregunta si la clase padre Object ya nos devolvió el puntero de su inicialización a nuestra clase, si ha tenido éxito quiere decir que el Inicializador de la clase padre se ha ejecutado correctamente y ahora puede ejecutar nuestro inicializador. Al igual que con los métodos podemos hacer inicializadores con parámetros siguiendo las mismas reglas de parámetros Externos-Internos. Un Protocolo en Objective-C es un archivo con extensión .h; en el solo se definen métodos con su alcance, tipo de retorno, nombre y parámetros. Cuando una clase implementa un Protocolo, los métodos definidos en él, se vuelven obligatorios para la clase. Para hacer uso de un Protocolo en una clase (Ejemplo: ClaseBase), en el archivo ClaseBase.h debemos de hacer la importación del archivo de cabecera del Protocolo:
Ejemplo: "MiProtocolo.h" En el mismo archivo (ClaseBase.h), seguido de la declaración de la Interface colocar entre símbolos "<>" el nombre del Protocolo. Ejemplo: @interface ClaseBase Ahora bien, en el archivo ClaseBase.m habrá que poner código a todos los métodos definidos en el Protocolo, pueden tener el funcionamiento que nosotros vayamos a implementar, más debe de respetar los parámetros y el tipo de retorno. Dentro del cúmulo de clases que contiene Objective-C, las más comunes y utilizadas son las que tienen el prefijo NS(NextStep). NSString <---- uso y manejo de strings NSURL <---- uso de direcciones de Internet (URL's). Para declarar un objeto de esta clase: NSURL *miurl = [[NSURL alloc]initWithString:@ "http://google.com.mx "]; //NSData puede capturar los datos recibidos a través de conexiones //a Internet. NSData *midato = [[NSData alloc]initWithContentsOfURL:miurl]; //Imprimimos el código fuente de la página // %s <--- es para tipos de datos char // %@ <---- es para tipos de datos NSString //(char *)[midato bytes]; <--- conversión de bytes a char (Casting). NSLog(@"%s",(char *)[midato bytes]); NSArray y NSDictionary trabajan de una forma muy parecida, las dos clases sirven para crear objetos que almacenan un conjunto de datos de forma lineal. La diferencia es que el primero, como es un array tradicional, se accede a sus datos a través de un índice numérico (0...N-1) y el segundo a través de una llave (numérica o alfanumérica). Los datos que se le ingresan a los dos tipos, son en el inicializador, es decir, desde que se realiza una instancia de la clase (un objeto). Después, sus valores se vuelven de "solo lectura". Para poder manipular esos datos se tiene que usar un tipo distinto que sea "mutable". Mutable significa que se puede modificar su contenido. (ejemplo: NSMutableArray). Para declarar un NSArray: NSArray *arreglo = [[NSArray alloc]initWithObjects:@"uno",@"dos",@"tres",nil];
//Para imprimir un elemento del arreglo NSLog(@"Elemento 1: %@",[arreglo objectAtIndex:1]); Para declarar un NSDictionary: NSDictionary*diccionario= [[NSDictionaryalloc]initWithObjectsandKeys:@"1",@"uno",@"2",@"dos",@"3",@"tr es",nil]; //Para imprimir un elemento del diccionario NSLog(@"Elemento 2: %@",[diccionario objectAtKey:@"dos"]);