Crear una aplicación productiva y social para iOs con interfaz web

En este artículo cuento mi experiencia de creación de la aplicación de iOs TimeBox ,desde el estudio de mercado, diseño, y elaboración de la interfaz gráfica  hasta la programación, creación de la base de datos y la aplicación web para redes sociales.

Lo primero que debemos hacer es tener claro qué tipo de aplicación queremos crear, para eso hay que tener una buena idea, y si la tenéis pero la aplicación ya está hecha, entonces comprar/bajaros todas las aplicaciones que han implementado vuestra idea y estudiarlas para encontrar en qué fallan, cómo las podéis mejorar y combinar, es decir, encontrad una motivación para programar, porque esto es duro amigos jeje

Fase 1: Tener una buena idea

En mi caso tenía claro que quería crear una aplicación que necesito, normalmente conozco gente cuando estoy de viaje o en la calle y me gusta asociar información que normalmente se me olvida de la persona, contactos en común, lugar donde conocí a la persona, una imagen, etc. al igual que necesito que la misma aplicación sea reutilizable, por ejemplo,  para generar notas que pueda convertir en públicas y además que pueda editarlas desde el PC sin tener que complicarme mucho la vida con sincronizaciones interminables…Además lo que me pareció también opcional pero interesante fué que la aplicación además de permitirme compartir información conmigo mismo y otras redes sociales, que pudiera editar los contactos de mi SIM del iPhone/iPad, así como otras muchas utilidades más, en definitiva tengo un gran proyecto entre manos y me lanzo a observar el mercado, como sabréis el iOS ya trae un editor de notas bastante bueno pero claro, se queda corto para lo que se puede hacer hoy en día con el SDK de la manzanita mordida…

Estudio de aplicaciones publicadas (marketing)

¿qué existe actualmente que cumpla mis necesidades?, la siguiente lista de aplicaciones de iOs son las que he encontrado y paso a comentarlas en el momento en que escribí este post:

  1. Awesome Note 5.0 : para mí, la mejor aplicación Cumple algunas de mis necesidades

    Algunos Screenshots :

      



















    Pros: muy buena presentación con mucho estilo, puede guardar y avisar con alarmas de eventos, el calendario es bastante chulo ,presenta las categorías de una forma muy original, servidor web integrado. Acceso a Google Docs para importar/exportar notas. Tiene muchas cosas chulas como los menús, los iconos, posibilidad de edición de notas con imágenes, notas de audio, etc.

    Contras: sin soporte de redes sociales,  ni dropbox,box.net,  etc. Google Docs tarda mucho. No existe ningún tipo de gestión de contactos, ni passwords, ni siquiera un servicio online para guardar las notas,aún así es la mejor… :) por ahora…

  2. Evernote 3.3.8: primera aproximación a un servicio online

    es un editor de notas con posibilidad de editar las notas online mediante un usuario y un password

    Aquí algunos screenshots:

    Pros: buen uso de las etiquetas (búsquedas, organización), uso de LIBRETAS como concepto de sección copiado de Google Notebook en lugar de usar categorías simples. Permite visualizar las notas por geolocalización,grabaciones de voz o fotos…
    Contras: no tiene redes sociales, ni sincronización con dropbox, box.net, google docs,etc. La organización global de las notas de una libreta tiende a confusión, podría ser más elegante  y añadir organización por título…
  3. Remember the Milk PRO: la versión de iPhone casi me convence
    demasiado sencilla y de pago
    Algunos Screenshots :










  4. Las mejores aplicaciones de este tipo –> TellMeLater y MindNote (iPad)

    Pros: evidentemente, como editor de tareas está genial, si nos gustan las cosas simples. Multiplataforma. Web!.

    Contras: sólo podemos ver notas del presente y futuro, necesitamos comprar la cuenta PRO para poder disfrutar de las maravillas que anuncian, enviar tareas a redes sociales. Si como yo, tenéis más necesidades como editar información asociada, añadir imágenes, importar/exportar datos, etc. la verdad es que se queda bastante corto para costar 25dólares al año, casi lo que cuesta Zattoo y con ésta puedo ver la Tv en cualquier dispositivo…

    4.- RE.minders: aplicación sencilla,parecida a iRemember –>para recordar qué tenemos prestado y a quién le debemos cosas o dinero. SafeWallet, passwd , TPassword, etc. son aplicaciones para gestionar nuestros passwords.
    5.- Days Until –> elegante aplicación para crear listas de fechas de cuentras atrás. Parecida a Today Basic.
    6.- Location Alarm: aplicación para añadir una geolocalización en una lista, al activarla sonará una alarma por proximidad, no le veo mucha utilidad sobre todo teniendo en cuenta la vida de batería de los dispositivos iOS y la sensibilidad del gps…pero curioso si que es jeje por ejemplo iParked si que es útil en este sentido pero no lo voy a utilizar en este momento.
    7.- reQall 4.0.1 –> gestor de tareas con posibilidad de crear notas por reconocimiento de voz, aunque no es muy fiable, es como Dragon Dictation, puede que no reconozca todo lo que decís aunque esto es innovador! trae un contador que tras crear una nueva nota/evento, de una forma muy dinámica y original se sincroniza con la web y si queréis algo más avanzado, a pagar para PRO!La web donde se pueden editar las notas/eventos está bastante chula, usa mucho AJAX aunque la sincronización de una nota/evento es lenta, aquí tenéis un resultado en la web:
    por suerte, también se pueden añadir notas vía texto.

    Pros: podemos asociar unas notas con otras, asociarlas a un contacto, sincronizarlas vía web, asignarles una categoría de una forma chula, generar una alarma (con repetición) y meterle etiquetas además de una grabación de voz…aquí el resto

    Contras: sólo está en inglés, no se pueden añadir imágenes ni posición GPS (si no pagamos 3dólares al mes), no trae soporte de redes sociales, no se pueden editar contactos,etc.

Casos curiosos de estudio (EXTRA!):

  1. Appsender: es una aplicación para enviar ficheros, texto, fotos, lo que sea, a bastantes redes sociales, inexplicablemente está sólo en alemán, y la web no da muy buena imagen, pero la idea es muy buena. De hecho, es muy innovador el servicio ya que se basa en darse de alta en un portal de mensajes de móviles y es a través de este servicio, más barato desde el que se propone la comunicación, así quien no tenga tarifa plana puede comunicarse y ahorrar. Si además queremos formatear los sms de una manera original (mms) tenemos textPlusGOLD. Desde luego quiero utilizar la idea del menú principal de esta aplicación, ya que es como el mismo dashboard de iOS pero dentro de una aplicación, ¿qué más se puede pedir? aquí un screenshot: 

  2. Delibar: aplicación que se conecta a nuestra cuenta de Yahoo! y desde esta a Delicious y de una manera super elegante nos va a permitir administrar los enlaces, añade un objeto navegador (Safari de iOS) para ver esas webs, claro, con soporte de etiquetas.
  3. biteSMS: Una de las ideas que algún amigo me ha propuesto es que se puedan programar los envíos de SMS y correos, desde luego esto lo he visto en aplicaciones de tipo “recuérdame”, “cumpleaños feliz”, etc. aunque es una vieja idea rescatada de aplicaciones de envío de SMS masivos de escritorio, ahora la recuperamos para meterla a correr bajo iOS.

Fase 2: Requisitos para crear la aplicación

Hardware y Software que nos exige la manzana mordida

  • OSX Snow Leopard , Hackintosh, …
  • XCode  + iPhone SDK: +  programa de desarrolladores de la empresa, probad siempre las aplicaciones en el dispositivo, la realidad dista mucho de la ficción del simulador…
  • iPhone/iPad/iPod: pues hombre, estaría bien  tenerlo para poder probar lo que escribamos, ya que el simulador (no es un emulador!) que trae el IDE se comporta de manera algo distinta a como debería ser…pero bueno, para empezar tampoco vamos a tirar la casa por la ventana jeje Si tienes un dispositivo intenta instalarte el AppWizard para el siguiente paso -no te diré como conseguirlo-

Habilidades que necesitamos para programar aplicaciones de iOS

  • Programar en Objective C: programar aplicaciones de iPhone en XCode es, básicamente, empezar a conocer cómo funciona Objective C y cómo asociar los objetos del Interface Builder a nuestro código. Para eso existen cientos de tutoriales, algunos más famosos que otros como “Masters of the Void“, pero lo mejor es seguir un libro gratuito de la propia empresa (en el apartado de desarrolladores) o ir a una biblioteca y pillarse libros como Objective C for dummies, iPhone application development for dummies, y luego algo más serio como iOs4 Programming Cookbook de O’Reilly, ya que contienen multitud de ejemplos y trucos para desarrollar todo lo que deseemos/necesitemos.
  • Diseñar como un ingeniero y producir como un artista: echad mano de vuestro amigo el arquitecto de información para encontrar la mejor manera para guardar los datos,… no es lo mismo una base de datos en SQLite que un conjunto de ficheros XML.Hay que conocer el flujo de la información en el sistema de aplicaciones, por ejemplo un sistema de etiquetas debe ser recurrente en cuanto a que hay tags que se repiten, la forma óptima de hacer esto es como lo hace WordPress o algunas aplicaciones web si lo prefieres. Debemos consultar a nuestro amigo experto en marketing para el nombre del programa, así será el dominio para publicarlo, también nos aconseja qué tipo de características son viables en cuanto a lo que el público demanda y nos da su perspectiva como experto lo bonito, barato y bueno. Efectivamente, necesitamos conocer cómo construir diagramas pero no son indispensables, aunque sería ideal diseñar previamente la app con UML
  • Beta tester: antes de empezar si quiera a pensar en querer programar algo para iOS ,lo primero que debemos hacer es conocer los dispositivos, el iOS y OSX, todos los widgets del sistema operativo, así que al menos tenemos que haber probado todas las aplicaciones antes mencionadas, aunque sea en el ifón de un amigo, no vale haberlo visto en vídeo, tenemos que tocar la esencia de la magia de esta tecnología para sentir qué queremos hacer realmente.
Seguid el curso de programación de aplicaciones de iOS aquí.
Fase 3: Diseño, programación y publicación

3.1.a.Diseño de la aplicación: conceptos

  • Concepto -recordar-:- aplicación para recordar cosas importantes, desde tareas, notas, cumpleaños,etc. hasta contactos y social media.Recordar -objetos opcionales-: – Posición GPS -localización y dirección- que enlace a Google Maps, título y texto, contactos asociados, imágenes asociadas, etiquetas, fecha y hora de inicio y (finalización) de completado o no -tarea-, alarma -fecha y hora-, posibilidad de enviar a la web (sincronización automática) ,permisos, categoría, grabación de voz asociada, text-expander (necesita la app textExpander instalada en el dispositivo y que nuestros grupos tengan la opción de compartir activada “Turn on Share Snippets”) , programar envío de un mail y un sms a un contacto -fecha y hora de cada posible evento-, añadir a favoritos -destacados o como se quiera llamar-. Las alertas deben crear un ventana popup llamada notificación con su icono de aplicación->objeto
  • Concepto -enviar-:- La aplicación debe tener un botón para automatizar el envío de un objeto a redes sociales como en la aplicación AppSenderEnviar a -además de la web como copia de respaldo y edición online-: – Mis localizaciones de Google Maps, Google Documents, Drop Box, Box.net, Twitter, Facebook, etc.

Tras la identificación de los conceptos ahora pasamos al diseño de las pantallas:

3.1.b.Diseño de la aplicación: dibujar los conceptos

En esta sección podemos utilizar papel y lápiz para dibujar todas las pantallas o bien algún software de tipo diseñador de plantillas de aplicaciones para iPhone/iPod/iPad, en mi caso he dibujado las cuatro primeras pantallas en papel y el resto en un diseñador de wireframes profesional, aquí os dejo las capturas:

  • Pantalla de inicio: mientras se cargan los datos de los servicios, se intenta actualizar las cuentas -si se ha puesto que se haga en las preferencias de la app- a la última versión (sincronización) y se crean las opciones aparece una pantalla que presenta el logotipo y “Cargando” con un porcentaje:
  • Pantalla principal: debe mostrar una vista como la app de facebook con los iconos igual de grandes que la app de dropbox, con un botón a la izda del nombre del programa para ir a la configuración y otro a la derecha para añadir un elemento al dashboard del programa, dicho dashboard de objetos del programa tiene los siguientes iconos:- recordatorios ,objetos como les queramos llamar: aquí están todos los objetos que hemos creado/importado- mensajes: programación de mensajes sms y correos- listado de las programaciones y si se ejecutaron o no- mis rss: para leer de los blogs en los que estoy dado de alta con mi cuenta de google reader- contactos: mis contactos, ver asociaciones de objetos, editar su información asociada al programa, etc.

    – mapa: pues un mapa con los objetos que disponen de este campo relleno

    – passwords: gestión de mis passwords de aplicaciones

    – ayuda: faq de como funciona la aplicación

    – appsender: zona de envío de los objetos a redes sociales configuradas

    – basura: para recuperar elementos como en Joomla

    – favoritos: objetos que hemos marcado como favoritos

    – enlaces:  gestor de url’s y navegador para visitarlos

    – cumpleaños: listado de cumpleaños de nuestros contactos de todas las redes y móvil

    – préstamos: gestor de cosas prestadas

    repetir esta imagen con todos los iconos…

    etc.

  • Pantalla de categorías de objetos-recordatorios: es una vista de categorías de objetos como Awesome Note…

    cada vez que pulsamos en una categoría deberíamos poder crear una subcategoría dentro de ella, la vista de una categoría me gusta que sea así:

    De modo que siempre podemos ver un calendario con todas nuestras notas, o bien organizarlas como la agenda, la lista de completadas o no, lista por detalles y lista por imágenes de ANote, queda otra vista que es la vista por mapa pero eso lo dejamos para el menú principal.
  • Pantalla de crear/editar un recordatorio:con RTM en el mismo título de tarea debemos poder añadir la fecha, la importancia, etiquetas, localización GPS, ciclo de repetición de aviso o notificación cada cuanto y aviso cuánto tiempo antes de que finalice…esto lo veo excesivo e inútil porque si queremos añadir caracteres especiales tenemos un problema sin embargo los botones si que vienen bien…por eso, es mejor poner sólo un título y un texto, justo debajo añadir una lista de botones como los de TwittBird, con todas las opciones pertinentes: libreta (categoría), etiquetas, posición gps, imagen, grabación de voz, publicación en redes sociales (un icono para todas), etc. así, van saliendo los iconos de cada opción elegida, igual que esta aplicación twittbird.
  • Cada botón realiza una acción diferente: guardar la posición GPS,  grabar voz, enviar, facebook, twitter o wordpress, asociar la nota a una lista de contactos, configurar las opciones: como fecha y hora de inicio y finalización para convertir el objeto en una tarea, repetición de esta tarea, alarma, categoría, favorito, etc.Los iconos verdes sobre los botones indica si las configuraciones de las redes sociales y de las acciones han sido establecidas correctamente.La tecla de la flecha es la que muestra en lugar del teclado todas las opciones, para volver pulsamos en el botón del teclado, por último para guardar y enviar pulsamos el botón guardar.

  • Pantallas de mensajes: Para sms hay un botón para seleccionar fecha y hora de envío y cuenta de caracteres, al enviarse pasan a controlarse por el teléfono
    Y para correos electrónicos, mediante un botón podemos seleccionar ficheros a enviar, luego se pasan a Mailer de iPhone:
  • Pantalla de Listado de programaciones de mensajesEste es el listado de mensajes programados, puede verse a simple vista el estado de cada tipo de mensaje

  • Pantalla de urls / navegador
  • Pantalla de Listado/Editor de Contactos

    Al pulsar en “Importar” podemos elegir desde donde queremos importar los contactos: redes sociales, libreta de contactos, etc. El botón de “Exportar” crea un fichero de contactos que puede ser enviado por correo electrónico o FTP. El botón de Favoritos sólo mostrará aquellos contactos que estén marcados como tales.
  • Pantalla de Mapa
  • Pantalla de gestión de passwords (edición y listado como el de url’s con distintos campos)
  • Pantalla de Ayuda (edición y listado como el de url’s con distintos campos)
  • Pantalla de envío a redes sociales Selección de redes tras seleccionar el objeto a enviar:(listado de selección de objeto como el de url’s con distintos campos)
  • Pantalla de Préstamos: (listado de selección de objeto como el de url’s con distintos campos)
  • Pantalla de Configuración (formulario con todas las opciones del programa)
  • Una vez que hemos dibujado sobre el papel lo que queremos ver en la pantalla, toca darse un paseo por el Interface Builder y echar mano de las herramientas dispuestas para hacer realidad nuestros sueños, claaaro!

3.1.c.Diseño de la aplicación: construir el interfaz de usuario

  • Introducción: En este apartado abriremos XCode y crearemos todas las clases para cada una de las vistas y editaremos cada uno de los ficheros .XIB en el Interface Builder para dejar las vistas tal como en el punto anterior…
  • Creación de clases: Sigue el patrón Modelo-Vista-Controlador, por extraño que parezca vamos a diseñar primero las clases de controladores y vistas, tomamos las pantallas y creamos clases UIViewController por cada una de ellas, excepto para la primera…Para la pantalla de inicio, la clase principal, es decir, donde haremos todas las operaciones que conectarán con el resto de clases, i.e., llamémosla “initApplication” (new file [Objective-C class] en el directorio iPhone e iPad) esta clase crea la ventana principal automáticamente ya que hereda de NSObject <UIApplicationDelegate>… (@interface initWindow : UIWindow), para asociarla la metermos dentro de ella una claseUIWindow *windowy así podemos controlar todo el esqueleto de la aplicación desde una clase, luego creamos las funciones para ir abriendo el resto de vistas por medio de sus controladores, para la pantalla principal creamos una clase TimeBoxMainViewController que es una UIViewController SubClass, que hereda de UIViewController, así que en su .XIB asociado (en custom class del inspector dentro de I.B.) vamos a diseñar la pantalla principal del punto 3.1.b.Y así con el resto de pantallas…al toro!La clase principal además sigue el patrón Singleton. Necesitamos poder acceder a cualquier parte de la aplicación en cualquier lugar.Las funciones que hacen posible crear una clase principal que siga el patrón Singleton están aquí:
     
    - (id) init {
     
    self = [super init];
     
    return(self);
     
    }
     
    + (miClasePrincipal *)  instancia {
     
    @synchronized(self){
     
    if (instancia == nil){
     
    instancia= [[self alloc] init];
     
    [instancia inicializarInstancia];
     
    }
     
    return(instancia);
     
    //instancia es del tipo miClasePrincipal:
     
    // + (miClasePrincipal *) instancia;
     
    }
     
    }

    podemos crear una instancia así:

     
    - (void)viewDidLoad {
     
    [super viewDidLoad];
     
    miClasePrincipal *instancia1= [miClasePrincipal instancia];
     
    miClasePrincipal *instancia2= [miClasePrincipal instancia];
     
    if ([instancia1 isEqual:instancia2] == YES){
     
    NSLog(@"Ambas instancias son la misma!");
     
    } else {
     
    NSLog(@"Las instancias son distintas.");
     
    }
     
    }

    Para crear el panel de control tipo “dock”, como el de appsender, o el de la aplicación de facebook, o la de grooveshark, dropbox, etc. es decir la primera pantalla, podéis seguir este magnífico tutorial: How to connect UIScrollView with UIPageControl.

  • Conexión entre clases:Ahora es cuando tenemos que pasarnos a la programación pura y dura si queremos hacer las cosas bien, primero deberíamos diseñar un diagrama de flujo, un UML general, UML de secuencia, aunque mis profesores me matarían al ver esto porque este paso va antes del diseño de la interfaz jeje aunque bueno, nos ajustaremos un poco…Diagrama de flujoDiagrama UML genérico de paquetes por dispositivos, clase principal + clases controladoras + interface builder

    A este UML le falta la clase que controla la aplicación, la que delega el contenido, por eso hablaremos de ella…

    La pantalla de inicio se muestra automáticamente porque es la que el programa del proyecto tiene asociada a MainWindow_iPhone.xib para iPod/iPhone y MainWindow_iPad.xib para iPad, definida en la clase que delega el control mediante la propiedad @property (nonatomic, retain) IBOutlet UIWindow *window;

    Para cargar la pantalla principal podemos crear una acción

    – (IBAction) showTimeBoxMain;

    que se asocia con estos .xib que acabo de mencionar, dentro de la clase que hemos llamado initWindow para cada dispositivo y hacer que esta función sea llamada en un evento cualquiera a vuestra elección desde el Interface Builder.

    Repitiendo esto mismo para todos los casos construimos nuestro prototipo de interfaz para revisión, aquí os dejo un vídeo de como ha quedado la interfaz (vacía de contenidos) para revisar si es lo que queremos, ahora es cuando debemos mostrar la interfaz de usuario a los usuarios finales para comprobar que efectivamente es lo que deseamos crear.

    El código para mostrar las vistas que vamos creando por medio de cada acción es sencillo, basta con que en la función que declaramos con la acción IBAction anterior declaremos la clase asociada a nuestro controlador para cada pantalla

    NombreClaseControladora *variable = [[NombreClaseControladora alloc] initWithNibName:@”NombreClaseControladora” bundle:nil];

    y luego utilizar un controlador de vistas, por ejemplo el de la propia ventana (window) mismo con:

    [self setRootViewController:variable];

    si queremos podemos utilizar una subvista o una ventana modal ( presentModalViewController ) que tiene animaciones y esas cosas tan “cool” , qué chuloo noo? jeje

    Este código es un ejemplo de cómo podemos cambiar de una vista a otra desde la “delegación” del control, usando un Outlet (variable que conecta el código con el editor para poder hacer paso de mensajes):

     
    - (BOOL)application:(UIApplication *)application 
     didFinishLaunchingWithOptions: (NSDictionary *) launchOptions {
     
    // Override point for customization after application launch.
     
    FirstViewController *Controller = [[FirstViewController alloc] 
    initWithNibName: @"FirstViewController"
     
    bundle:nil];
     
    self.navigationController = 
    [[UINavigationController alloc] 
    initWithRootViewController:Controller];
     
    [Controller release];
     
    // Add the view controller's view to the window and display.
     
    [window addSubview:self.navigationController.view];
     
    [window makeKeyAndVisible];
     
    return YES;
     
    }

    Cuando creéis una instancia de una clase de un Controlador no os olvidéis de hacer “release”, es decir, liberar la memoria de esta clase, lo mismo pasa con la copia que se ha hecho en self.navigationController, debéis usar [navigationController release] en la función dealloc de la clase que controla la delegación del programa.

    El navigationController es una clase que incluye una barra de navegación y un controlador de vistas para mostrar las vistas que tienen asociadas los controladores activos en el momento.

    La pantalla principal es un fichero XIB que se compila a NIB e incluye una vista por defecto que se carga al lanzar la aplicación, en nuestro caso es una vista que muestra un scrollview que guarda una caché de vistas y cada una de las vistas de esta caché no es más que un conjunto de botones y etiquetas dispuestos en posiciones simétricas a modo de menú de botones con los que ir cargando otros controladores y vistas.

    Es importante diseñar el modelo de datos al principio, el proyecto por defecto de XCode para crear una aplicación con CoreData hace una gran parte del trabajo, podemos utilizarla para empezar, luego podemos cambiar la clase inicial para que cargue la/las que nos apetezcan.

     

3.2.a.Programación de la aplicación: el prototipo

  • Hay que enseñarle el prototipo (intentad construir una versión de beta-tester para los amigos, aunque sea con los métodos de Cydia para que se pueda instalar sin firmar, si no tenéis dinero para pagar la licencia de desarrollador) a alguien que pueda probarlo y tomar nota de las opiniones de los usuarios finales para producir los cambios necesarios en aquel.
  • El prototipo no tiene por qué incluir datos ni funcionamiento reales, se trata simplemente de que los usuarios finales vean la aplicación y tomen parte en las decisiones del diseño, para poder cambiar partes del mismo sin tener que modificar el modelo de datos, ni otras funciones más importantes de la programación. El prototipo debe incluir la pantalla principal y varias subpantallas de petición de datos aunque no guarden nada servirían para dar una idea de la aplicación como si fuera un lanzamiento de producción.
    Existen páginas como iBetatester que permiten subir nuestra app y asignar a los voluntarios para que la prueben y nos remitan sus comentarios al respecto. Esta fase es importante tanto como cualquiera pues son estos mismos usuarios los que comprarán y usarán la aplicación final.

3.2.b.Programación de la aplicación: implementación

Del patrón MVC, ahora vamos por el MODELO

  • Lo primero que debemos hacer para implementar es la forma en que vamos a guardar los datos que nos comentó nuestro amigo el arquitecto de la información, en nuestro caso utilizaremos SQLite, podemos diseñar la base de datos primero con un Diagrama de Entidad / Relación como dios manda jeje,  y luego, probar que efectivamente funciona desde el metro o el autobús…¿cómo? ,me he perdido Juan, pues sí, con esta Aplicación SQLitede iOS…jejeje ah, que es de pago…entonces podemos usar la de firefox que es gratis :)
  • Ejemplo de Diagrama de E/R con SQLite (usando el plugin de Firefox)
  • Este ejemplo es el de Momento App (momentoapp.com). Como véis el programador de la aplicación ha optado por llamar a todas sus tablas dándoles el prefijo Z y al igual que a los campos importantes o identificadores: Z_ mientras que los campos más comunes o normales vuelven a tener el prefijo Z.Estructura de la base de datos del ejemplo:Todas las tablas tienen un identificador principal Z_PK o llave maestra que utiliza para identificar una tupla. Z_ENT es un número que identifica el tipo de entidad, así puede organizar tipos de datos de una forma más cómoda, sean paises, personas o incluso etiquetas o cualquier otra cosa.Z_OPT es un dato opcional para hacer relaciones internas con la programación.Las tablas que sólo sirven para relacionar objetos entre sí son las que relacionan momentos con otros tipos de objetos: etiquetas, personas, eventos y lugares.La idea de este programador ha sido la de crear una tabla donde colocar todos los tipos de entidades, llamada Z_PRIMARYKEY, donde guarda además la cuenta de estos tipos, es una buena opción aunque hay que estar manteniendo estas estadísticas desde varias partes de la aplicación…al igual que las palabras clave, repite la misma palabra aplicándole un filtro para poder buscarla sin caracteres extraños en cualquier entidad y dato asociado a esta, es una buena manera de crear una arquitectura de información basada en etiquetas, este truco lo repite varias veces, por ejemplo en un contacto guarda, además del nombre de forma “amigable” para un buscador, su inicial para introducirla más fácilmente en una búsqueda por letra inicial en cualquier tipo de widget. Otro truco para reconocer los campos que ha creado en tablas de relación entre entidades es darle, tras el prefijo de nombre Z_, el número de entidad tanto a tablas como a campos dentro de estas, por ejemplo Z_4MOMENTS significa, por el 4, mirando la tabla Z_PRIMARYKEY, una tabla de relaciones entre momentos(7)y eventos (4).

    en esta imagen se puede observar el Diagrama de E/R que he diseñado yo mismo a raíz de la base de datos SQlite de la app. Ahora tenemos que utilizarla como base para diseñar otra cosa más sólida… jeje

  • Los cambios son evidentes, empezando por…que necesitamos traducir la aplicación por lo tanto también campos adicionales para cada idioma
  • Si no hemos seguido el tutorial anteriormente propuesto podemos ver qué nos tienen los amigos de iPhone SDK Articles preparado acerca de SQlite: aquí.
  • Para la parte de la programación de las clases-modelo y sus vistas vamos a utilizar un patrón…polimorfismo!! ( ver tutorial)para atender eventos de los objetos, añadimos las clases que tratan los eventos de dichos objetos, a las clases de los controladores de las vistas donde se encuentran los objetos cuyos eventos vamos a escuchar, por ejemplo, en un UIViewController vamos a añadir una clase que proporcione los datos de una lista de opciones, por ejemplo un picker –> UIPickerDataViewSource para cargar los datos y UIPickerViewDelegate para atrapar y tratar los eventos en funciones dentro de la clase donde se hace el polimorfismo, que será del tipo:
    @interface miClaseControladoraDeVista : UIViewController  {//...}

    de modo que ahora desde el Interface Builder podemos vincular los objetos con delegate y datasource con la clase controladora de la vista actual…pero qué pasa si hay más de un picker? lo veremos…En el caso de tener un picker dividido (dos listas) en dos, lo que hacemos es que en el código definimos la función numberOfComponentsInPickerView: (UIPickerView *) pickerView { return 3;}

    donde el 3 es el número de separaciones, ahora para indicarle al objeto qué número de objetos hay en cada una de esas secciones, usamos un poco de lógica de Objective C, definiendo la función:-(NSInteger)pickerView numberOfRowsInComponent: (NSInteger) componente { //Comprobaciones del tipo de objeto y devolver el número de filas… return [myObject count];}

    lo que hacemos es decirle al compilador: ve al pickerView y para la función del número de filas, para el selector elegido (llamado componente) devuelve el número de filas x.

    Para poder acceder al picker y leer el índice de selector elegido desde fuera de un evento relacionado con su manejador de eventos (por ejemplo un botón), definimos una propiedad que viene a ser el picker en sí mismo y que en el I.B. hemos conectado también desde una referencia externa o outlet del file’s owner, es decir, vinculamos el objeto con la propiedad en la clase controladora de la vista que estamos manejando, y ahora desde el código podemos referenciarnos mediante el nombre de la propiedad (@property… en la cabecera, de tipo del objeto a usar) a ese objeto y obtener acceso a sus métodos y propiedades, por ejemplo, si guardamosen un array todas las opciones de un picker, la propiedad se define como myPicker y accederemos alelemento seleccionado así[array_de_datos objectAtIndex:[myPicker selectedRowInComponent:0]]donde el 0 sería la sección y array_de_datos el arraydonde guardamos el tipo de datos para ese selector y que habíamosusado también en las funciones numberOfRowsInComponent y

     
    -(NString *) pickerView: (UIPickerView *) 
    pickerView   titleForRow: (NSInteger)row 
    forComponent (NSInteger) component {
     
    //... sacar el título de los arrays o consultas SQL
     
    }

    en este caso le decimos al compilador que vaya al objeto pickerView y que dentro de el título para cada fila se obtendrá, en función del número de componente.

Para conocer

Publicar la aplicación por Piter »

3.3 Publicación de aplicaciones

Este tema se ve en el Curso de Aplicaciones de iOS de este blog, básicamente consiste en crear un certificado con el “Acceso a llaveros” de OSX, enviarlo a Apple Developer, crear un ID de Aplicación, descargar este certificado, crear un “mobileprovision” primero para desarrollar y luego para distribuir, compilar en XCode con este certificado, crear en iTunes Connect la App con todos los datos, subirla con la herramienta de XCode, esperar la validación y por fin, aceptar para la venta.

 

 

 

 

 

 

Artículos relacionados:

Please type the characters of this captcha image in the input box

Por favor escriba los caracteres de la imagen captcha en el cuadro de entrada

footer
jbelon © | sitemap.xml