jueves, septiembre 24, 2009

GeneXus y iPhone III


Luego de haber desarrollado la aplicación web, haber embebido la misma dentro de una WebView para transformarla en una aplicación nativa iPhone y haber testeado con éxito la misma en el simulador de iPhone que viene con el SDK, es momento de transferir esta aplicación a un teléfono de verdad, ya que el comportamiento en el mismo es diferente al que se aprecia en el simulador debido básicamente a que el hardware del teléfono no es tan potente como el que utiliza el simulador.

Estaba pensando como armar un tutorial, cuando me di cuenta que tendría que pasarme por lo menos una hora pegando screenshots y escribiendo los pasos a seguir, por lo que me pareció más beneficioso (al menos para mi) compartir el link a este sitio donde encontré el mejor y más claro tutorial de la web.


Cuando yo decidí pasar mi aplicación al teléfono, obviamente lo intenté hacer sin leer nada y a lo guapo... primero intenté con el iTunes, luego con un software que permite explorar los archivos en el iPhone (iPhone Explorer) y luego mediante SSH usando un terminal que bajás de Cydia... pero no logré nada, el teléfono no reconocia la aplicación como tal, por lo que empecé a buscar en internet como hacerlo.

Primero fui directo al sitio de Apple donde la documentación es excelente, pero como todo uruguayo desconfiado, no "acredité" cuando llegué a la parte donde decía "para poder transferir una aplicación a un teléfono, tenes que ser miembro del Programa de Desarrollo iPhone (IDP), y tenes que pagar U$S 99 para obtener un certificado para firmar el código y un provisioning profile para que el teléfono pueda ejecutar tu aplicación" ..... cric cric....

"Pero... entonces para poder testear mi aplicación en mi teléfono, tengo que pagar U$S 99 ???"
Yes sir... hay que pagar.

Esto, para alguien que realmente piensa desarrollar aplicaciones para iPhone, no suena tan caro... pero desalienta a quien quiere testear su primer y probablemente única aplicación !!

Después de leer y releer la documentación e intentar inscribirme al IDP sin pagar y no lograr avances, desistí de hacerlo por la derecha y pasé a leer la "otra" documentación... la que no va tan por la derecha (cosa que no apoyamos para nada!!! es más ... la repudiamos!!) y que en general te saca del apuro, al menos para el uso personal... yo solo quería ver mi aplicación en el teléfono!! no pensaba comercializarla ni subirla al Apple Store ( claro... si pagás los U$S99 obviamente el paso siguiente es postearla al Apple Store y esperar la aprobación ).

La cosa es que encontré algo de información respecto al tema... muchos workarounds para probar, pero ninguno que realmente funcionara. Hay un método que explica como crear un certificado y hacerle pensar al teléfono que tiene un provisioning profile y lograr que ejecute código no firmado, pero parece que dejó de funcionar luego de la version 2.1 del S.O. del iPhone. (lo digo con propiedad ya que tuve que reinstalar el SDK luego de tocar muchos archivos al parecer importantes para el funcionamiento del mismo :P ).
Si alguien lo quiere probar, este es el link How to deploy an iPhone application without an IDP membership

O sea... en resumen, (increiblemente) no aconsejo perder tiempo intentando hackear el proceso oficial. Si querés transferir la aplicación al teléfono, lo mejor es tomarse el tiempo y tener la paciencia de llenar formularios y seguir el tutorial del link que les pasé más arriba.
Una vez que hacés esto y tenés bien configurado todo, el camino de ahi en más es bastante más sencillo, incluso para la publicación en el Apple Store.

Existe una alternativa al Apple Store llamada Cydia que vendría a ser un repositorio de aplicaciones de código no firmado. Aun no lei mucho de como realizar un deploy en Cydia, simplemente vi muy por arriba que también es un proceso complicado ya que hay que armar un paquete de determinada forma... espero poder hacer un post con este otro proceso cuando tenga un tiempo para investigar.


Si te sirvió el tutorial, regalanos una cerveza!!





sábado, septiembre 19, 2009

GeneXus y iPhone II

En este post les cuento como transformar tu aplicación web para iPhone en una aplicación nativa Objective-C.
La ventaja es que no parece una aplicación web y no muestra las barras de dirección y la barra de navegación del browser, permitiendo aprovechar al máximo la pantalla.
Las desventajas (al menos las que me encontré yo en mi primer aplicación) son que no podes abrir nuevas ventanas (tipo target=_blank) y que no podés guardar cookies como lo harías en el browser común.

La primer desventaja es facil de sobrellevar ya que no hay necesidad de navegar hacia otra ventana, es más, se me ocurre que lo mas prolijo y el mejor método para que parezca una aplicación no-web es diseñar la pantalla utilizando un "gran" div que sirva de contenedor e ir modificando sus elementos via ajax, asi nunca "cambiamos" ni siquiera de pagina.
Yo haría una pagina, llamemosle aindex.aspx (es un procedure GX main http). Esta pagina tiene dentro un div "contenedor" con 2 divs hijos "header" y "body". El div header se reescribe por javascript, si es necesario, cada vez que se cargan nuevos contenidos en el div body y al div body se le va cambiando el contenido via ajax usando jquery (para aprovechar los efectos de transicion), de esta forma siempre estariamos parados en index.aspx. Pero esto es solo una idea.

La segunda desventaja se puede solucionar utilizando el motor de base de datos que tiene incorporado el iPhone y crear una tabla donde almacenar las cookies, sesiones o cualquier otro dato que se necesite.

Bien, tenemos nuestra aplicación web (ver post GeneXus y iPhone) y queremos transformarla en una aplicación nativa iPhone. Voy a tratar de hacerlo en forma de wizard asi queda mas ordenado:

1) Conseguite una Mac o una maquina Intel, instalate el MacOS Leopard 10.5.X o instalate alguna distro de MacOSX86 para pc e instalá el SDK del iPhone.

2) Abrí el XCode y seleccioná crear una aplicación "view-based", ponele un nombre que tenga que ver con tu aplicación web, para este ejemplo le pongo "Eventos".




3) Localizá el archivo EventosViewController.h, abrilo en el editor y modifcalo para dejarlo asi:

#import <>
@interface EventosViewController:UIViewController {
IBOutlet UIWebView *webView;

}
@property (nonatomic, retain) UIWebView *webView;
@end




4) Localizá el archivo EventosViewController.xib y abrilo haciendo doble click, te debería abrir un editor llamado Interfase Builder que sirve para diseñar las pantallas. Arrastrá desde la librería de controles el control llamado UIWebView.
Luego tenés que hacer un link entre el objeto File's Owner y la UIWebView que agregaste... esto lo haces cliqueando con el botón derecho en File's Owner y arrastrando hasta la UIWebView y seleccionando "view" en las opciones que te presenta. Ya podés salvar y cerrar el Interfase Builder.






5) Localizá el archivo EventosViewController.m, abrilo y modificalo para dejarlo asi (cambiando la url para apuntar a tu aplicacion) ... aca se ve feo, pero en el editor no es tan entreverado:

#import "EventosViewController.h"
@implementation EventosViewController
@synthesize webView;
-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
}
return self;
}
-(void)viewDidLoad {
NSString *urlAddress = @"http://www.miservidor.com/eventos/aindex.aspx";
//Create a URL object. NSURL *url = [NSURL URLWithString:urlAddress];
//URL Requst Object
NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
//Load the request in the UIWebView.
[webView loadRequest:requestObj];
}
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
-(void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
-(void)dealloc {
[webView release];
[super dealloc];
}
@end



6) Cliqueá el boton Build & Go del XCode y listo!! Ya tenes una aplicación iPhone nativa!
Luego podes modificar el archivo Eventos-info.plist (es el archivo de configuración de la aplicación) para agregarle datos, como por ejemplo, el nombre, el ícono (debe ser un png de 57x57 pixels), etc etc.

Resumiendo, poniendo un poco de pienso en alguna funcionalidad de la aplicación que utilice cookies u otra funcionalidad que no se comporte como debe (que a mi no me sucedió) y escribiendo solo unas pocas lineas de código, tenemos una aplicación iPhone ... lo bueno, además, es que esta aplicación "cambia" segun cambiemos el código en nuestro server ya que esta hosteada allí.
Se podría también importar todos los fuentes de la aplicación web al proyecto en XCode y apuntar la UIWebView a un archivo local a la aplicación ... pero esto depende de la naturaleza de la aplicación... si se nutre de la web no tiene sentido ya que de todos modos consumiría datos el server... no se.. es otro approach válido.

Una vez que lograste compilar y ejecutar esto en el simulador del iPhone en el SDK, seguramente te sientas entusiasmado y quieras transferir la aplicación a tu celular para probarla y para mostrarle a tus amigos!!!
Bueno... no te emociones mucho, porque eso que parece una tontería no es para nada sencillo (@Enrique: ojalá fuera solo transferirla con iTunes al teléfono).

Pero esto.... esto es lo que guardamos para el siguiente post!!!
( y si che... tanto tiempo sin escribir nada que tengo que ir largando de a poco las cosas!!)

Si te sirvió el tutorial, regalanos una cerveza!!










jueves, septiembre 17, 2009

GeneXus y iPhone


En el evento se mencionó timidamente la palabra iPhone en alguna charla, pero más que nada como caso particular de los "smartphones" en general.
Una aplicación iPhone es lo que está de moda, es lo que todo el mundo quiere hacer y es lo que muchos se preguntan cómo hacer.

Una aplicación iPhone puede ser de 2 tipos (ambos son aceptados en el Apple Store o en Cydia). Puede ser una aplicación nativa desarrollada en Objective-C o puede ser una aplicación web (webapp) que respete una serie de recomendaciones de Apple.

Si queremos desarrollar una aplicación nativa, necesitamos una máquina donde podamos correr el sistema operativo MacOS y utilizar el editor XCode que se instala con el iPhone SDK. Necesitamos además aprender a programar en Objective-C. La ventaja de una aplicación nativa es que tenemos acceso a todas las funcionalidades y features del teléfono, como por ejemplo la cámara, el acelerómetro, los contactos, etc.

Si queremos desarrollar una aplicación web, tenemos varias opciones.

1) Desarrollar una aplicación utilizando el Dashcode (iPhone SDK y MacOS) que nos brinda varios templates y una libreria de controles que podemos poner en la pantalla mediante drag&drop. Consumimos webservices para la comunicación con el server.

2) Desarrollar una aplicación web como lo hacemos habitualmente, utilizando html, css y javascript y ejecutar la misma en el browser del teléfono.

3) Idem al punto 2, pero luego embeber esta aplicación en una "cáscara" de aplicación nativa de iPhone utilizando el XCode en MacOS. Esto lo que hace es ejecutar un browser dentro de una aplicación nativa de tal forma que no te das cuenta que es web.

Dado este entorno, y si tuviera que hacer una aplicación iPhone, no elegiría hacer una aplicación nativa ya que no veo conveniente hacer algo que corra solo en una plataforma (además de aprender Objective-C para terminar haciendo simplemente altas, bajas y modificaciones en una base de datos).
Asi que iría por el lado de las aplicaciones web.

El punto 1 lo probé, me pareció muy piola sobre todo porque ya te resuelve todo el tema de las "animaciones" y "transiciones" tan bonitas que tiene el iPhone para pasar de una pagina a otra o para hacer efectos. Es simplemente decirle como hacer la transicion (similar a elegir un efecto en Power Point). En cuanto al código, lo bueno es que solo hay que saber javascript, por lo que podes hacer request ajax para comunicarte con el server y ejecutar procedures main HTTP o webservices de gx.

El punto 2 es el más sencillo de todos.
Ojo que no es solo hacer la pantalla más chiquita para que entre en el iPhone, es bastante más. Hay que repensar tu aplicación para que en cada pantalla puedas resolver las acciones utilizando solo 1 o 2 botones y tiene que ser altamente customizable (es decir, prendé fuego las tablas y utilizá solo divs y muchisimo css).
Me quedo con la ppt de Gastón Milano de "Los 3 fantásticos" son fundamentales para una aplicación web... html, css, javascript.
Lo ideal sería escribir a mano en procedures main HTTP el código html (evita tener que bajar el gxgral.js y el dojo.js que son muy pesados y si los usuarios que usan la aplicación son "one-time users" y no tienen cacheado estos javascripts, se aburren y cierran el browser antes de que cargue la aplicación) y no utilizar webpanels y menos transacciones, pero esa es una decisión de cada uno. (Hay que tener en cuenta que el tráfico en kbs y la cantidad de requests es crítica para que la aplicacion funcione correctamente).
Es necesario utilizar alguna libreria javascript que te permita emular las transiciones y animaciones, jQuery es suficiente, sin embargo hay librerias especializadas y pensadas para el browser del iPhone (PhoneGap, UIWebkit, etc).
(En un post futuro haremos una evaluación de PhoneGap que es muy poderosa ya que utiliza bibliotecas compiladas en Objective-C para poder acceder a features del iPhone mediante javascript... aunque el Apple Store no está aprobando las aplicaciones que utilizan este framework).

El punto 3 es el más atractivo para mi. Todo lo que hiciste para terminar tu aplicación en el punto 2, ahora lo podes poner facilmente en una cáscara de aplicación nativa y ver tu webapp "transformada" en una iPhone Application. Lo que se debe tener en cuenta es que no se puede abrir otra ventana del browser, asi que si tienen algun "target=_blank" por ahi, hay que sacarlo.

Qué otra ventaja tiene hacer tu aplicación web y no nativa... que esa misma aplicación si la pensaste bien, funciona en cualquier browser de cualquier teléfono móvil, y solo necesitas cambiar el css de la misma.

Ahora bien, mucho teórico y nada de práctica.... estas son unas screenshots de una aplicación generada con genexus y con mucho javascript para que la experiencia de navegación del usuario no sea diferente a la que tendría si fuese una aplicación nativa (cosa que no se verá en las fotos, pero espero poder hacer un video de como se ve en el telefono realmente). Esta aplicación está embebida en una aplicación nativa iPhone como mencionamos en el paso 3.

La aplicación sirve para organizar eventos, los invitados pueden confirmar su participación via email, via sms, via web... y ahora via iPhone. Se pueden subir fotos del evento y se pueden realizar comentarios.



En el siguiente post, si hay interés, les contamos cómo es la odisea de la publicación de una aplicación en el Apple Store... y sin ir mas lejos, cómo tenes que hacer para poder instalar tu aplicación en tu teléfono y los de tus amigos para poder testear el desarrollo.

También explicaremos como hacer el paso 3 que mencionabamos antes y poder transformar tu aplicación web en una aplicacion nativa iPhone en unos pocos y simples pasos.


Si te sirvió el tutorial, regalanos una cerveza!!





martes, septiembre 15, 2009

Por las calles de Montevideo...

Mientras toda la comunidad habla del Evento GeneXus... nosotros no...
Esta es la panorámica que me encontré hoy desde la ventana de la oficina!.



El único comentario que puedo hacer es "Arriba el bolso!!" :)