Ln la acLualldad exlsLe un fuerLe lnLeres por parLe de los
programadores en el desarrollo de apllcaclones para dlsposlLlvos mvlles de Appel como: lad, lhone e lod 1ouch, Lodos ellos basados en el slsLema operaLlvo lCS. lCS revoluclon el mercado de los Lelefonos mvlles en 2008 con la sallda del lphone 3C y redeflnlo el conceLo de Lelefono lnLellgenLe, en lo que hoy conocemos como SmarLphone. lCS fue el prlmer slsLema que permlLl que los desarrolladores programaran apllcaclones Lan funclonales o lncluso exLenslones de las clslcas apllcaclones de un C. arLe de la compeLencla vlo el camlno marcado y se subl al carro como Coogle y oLros que hlcleron caso omlso (nokla y Symblan), han caldo hasLa casl la desaparlcln. uados los requlslLos de desarrollo que lmpone Apple en esLe curso se ha opLado por expllcar con ms deLenlmlenLo el desarrollo en Androld e lnclulr slmplemenLe un pequeno Lema para el desarrollo en lCS de manera que slempre el alumno con las acLlvldades de aprendlza[e propuesLas pueda ampllar su conoclmlenLo por el lado del desarrollo en lCS. Asl slmplemenLe, se proponen como ob[eLlvo de aprendlza[e del Lema conocer la arqulLecLura de lCS y poder compararla con la de Androld y conocer los fundamenLos del lengua[e de desarrollo a uLlllzar Cb[ecLlve-C, el enLorno prlnclpal para desarrollarlo: xCode y un e[emplo senclllo reallzado en su dla para lCS 4.
Principales caractersticas de la arquitectura AnLes de lCS 4, la mulLlLarea esLaba reservada para apllcaclones por defecLo del slsLema. A Apple le preocupaba los problemas de baLerla y rendlmlenLo sl se permlLlese correr varlas apllcaclones de Lerceros al mlsmo Llempo. A parLlr de lCS 4, dlsposlLlvos de Lercera generacln y posLerlores soporLan el uso de 7 Als para mulLlLarea, especlflcamenLe: !Audlo en segundo plano !voz l !Locallzacln en segundo plano !noLlflcaclones push !noLlflcaclones locales !CompleLado de Lareas !Camblo rpldo de apllcaclones Sln embargo, no conslsLe en una verdadera mulLlLarea, pues las apllcaclones a[enas al SC, quedan congeladas en segundo plano no reclblendo un solo clclo de relo[ del procesador. La arqulLecLura de esLa plaLaforma Loma como base el nucleo del SlsLema Mac CS x del que Loma el kernel denomlnado Mach Kernel. Sobre esLe se desarrolla una arqulLecLura de capas concepLualmenLe muy slmllar a lo ya vlsLo para Androld (recordar que Androld es posLerlor y ha sldo en mulLlples ocaslones acusado de ser una copla de lCS). Sobre esLe kernel se encuenLran por LanLo las dlsLlnLas capas de servlclos que son usados para lmplemenLar apllcaclones sobre la plaLaforma.
La esLrucLura en capas resulLa clave cuando hablamos de lmplemenLar el cdlgo. or e[emplo el Core CS y los Core Serlces conLlenen los lnLerfaces fundamenLales para lCS lncluyendo aquellos usados para acceder a flcheros, los Llpos de daLos de ba[o nlvel, acceso a sockeLs, eLc. LsLos lnLerfaces esLn basados en C e lncluyen Lecnologlas como Core loundaLlon, ClneLwork, SCLlLe, CSlx threads, eLc. Segun conslderamos capas superlores enconLramos Lecnologlas ms avanzadas que usan lnLerfaces basados en una mezcla de C y Cb[ecLlve-C. Asl por e[emplo la cada Media conLlene las Lencologlas fundamenLales para grflcos 2u y 3u, audlo y vldeo con una Lecnologla Lamblen basada en C sobre CpenCL. 1amblen desLacan en esLa capa Lecnologlas como CuarLz, Core Audlo o Core AnlmaLlon (moLor desarrollado en Cb[ecLlve C para anlmaclones mulLlmedla). La capa Cocoa Touch basada prlnclpalmenLe en Cb[ecLlve-C es la lnfraesLrucLura bslca sobre la que se apoyan la gran mayorla de las apllcaclones con clases para venLanas, vlsLas, conLroles, eLc por un lado en el denomlnado ulklL y soporLe a la programacln orlenLada a ob[eLos con clases para colecclones, gesLor de flcheros, operaclones de red, acceso a accesorlos hardware como el glroscoplo, acelermeLro, eLc. Asl declmos que La llbrerla Cocoa esL dlvldlda en dos klLs: !Application Kit LsLe klL conLlene Lodas las clases relaclonadas con la lnLerfaz grflca (venLanas, boLones, ca[as de LexLo, eLc.). ero el AppllcaLlon klL es mucho ms que un con[unLo de componenLes de lnLerfaz grflca, Lamblen nos da acceso a CpenCL, o Llene clases para gesLln de documenLos (medlanLe el paLrn vlsLa-documenLo usado Lamblen en oLros muchos frameworks de programacln), o por e[emplo, Lamblen Lrae clases que encapsulan fuenLes, colores, lmpresln, correccln orLogrflca o drag and drop. !Foundation Kit LsLe klL conLlene Lodas las dems clases no vlsuales como son las clases de acceso a flcheros, de programacln mulLlhllo, de Lraba[o en red, de uLllldad, de gesLln de cadenas, eLc. LsLa capa Cocoa y el framework ulklL son la base por LanLo para el desarrollo de apllcaclones y la uLlllzada en la mayorla de las ocaslones de[ando slo para casos muy especlflcos las capas de programacln que LraLan con las capas de ms ba[o nlvel.
"#$%&'()%*+
Ll lengua[e de programacln para el Suk de lCS es Cb[ecLlve-C- Se LraLa de un lengua[e orlenLado a ob[eLos que fue desarrollado por la empresa nex1 creada por SLeve !obs Lras acabar su prlmera eLapa en Apple. La exLensln de los flcheros en Cb[ecLlve-C es .m y aunque pueden compllarse desde el compllador esLndar gcc aunque a dla de hoy se uLlllza hablLualmenLe el sofLware xCode . Ll e[emplo ms senclllo de programacln en Cb[ecLlve-C serla: #import <stdio.h> #import <stdlib.h> Int main() { Printf(Hola mundo\n); Return EXIT_SUCCESS; } Cue se puede compular desde la llnea de comandos con gcc holamundo.m o holamundo Ln la mayorla de los casos las clases desarrolladas heredan de la clase base NSObject que sobre Lodo lncluye un modelo proplo de gesLln ed memorla, slempre el aspecLo ms crlLlco en los lengua[es orlenLados a ob[eLos. Si en XCode seleccionamos crear un nuevo fichero de tipo clase CocoaTouch y en Objective-C el cuerpo de la clase que se crea es el siguiente: #import <Foundation/Foundation.h> @interface SayHello : NSObject { } @end
Donde se puede ver la sintaxis de Objective-C para importar ficheros de cabecera (Foundation.h) y cmo la clase queda declarada como heredada de NSObject. Si queremos aadir un mtodo al fichero de cabecera (.h) la declaracin sera la siguiente: #import <UIKit/UIKit.h> #define GREETING @"Juanpi" #define AGE 38 @interface SayHello : NSObject { NSString * test; } - (void) sayHello: (NSString *) name; @end un lnLerface declara la clase, sus daLos y sus meLodos. La dlrecLlva @interface lndlca al compllador que comlenza la declaracln de una clase prlmero con las varlables mlembro como en esLe caso NSString * test donde cada lnsLancla u ob[eLo de la clase almacenar una cadena de LexLo. or oLro lado los meLodos se declaran lnlclando por un - (se usar un + para los denomlnados meLodos de clase pero su deflnlcln queda fuera de los ob[eLlvos de esLe Lema), posLerlormenLe el Llpo devuelLo, el nombre del meLodo (sayHello) y los parmeLros de enLrada que en esLe caso reclbe el nombre name y es un punLero a la clase NSString. MlenLras que el flchero de lmplemenLacln de la clase de exLensln .m ser el slgulenLe: #import "SayHello.h" @implementation SayHello - (void) sayHello: (NSString *) name { NSLog(@"Hello %@, %@. Tienen %i aos", name, GREETING, AGE); } @end or su parLe la dlrecLlva [lmplemenLaLlon deflne donde comlenza la lmplemenLacln de la clase y en esLe e[emplo no hay nada que desLacar salvo el meLodo nSLog que muesLra en la venLana de depuracln del enLorno de desarrollo los LexLos, varlables y consLanLe que se deflnan en el cuerpo de la funcln. or ulLlmo se uLlllzarla esLe cdlgo en el flchero maln.m de la slgulenLe manera (cree en xCode una apllcacln vlew-8ased, por e[emplo) #import <UIKit/UIKit.h> #import "MyClass.h" int main(int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; SayHello * objMyClass = [[SayHello alloc] init]; [objMyClass sayHello]; [objMyClass release]; int retVal = UIApplicationMain(argc, argv, nil, nil); [pool release]; return retVal;
,
!"#$#"% '(($#)*"#+,-
ara probar cosas bslcas sobre la slnLaxls de xCode podemos crear Utility Application desde xCode y anadlr cdlgo bslco en los flcheros MainViewController.m y FilpsideViewController.m . Ll slgulenLe cdlgo muesLra slnLaxls bslcas y Llpos bslcos en Cb[ecLlve-C. or e[emplo en MainViewController.m podemos anadlr: (void)viewDidLoad { [super viewDidLoad]; for(int i = 0; i < 5; i++) { NSLog(@"i's value:%i",i); } } ? en FilpsideViewController.m crearemos esLos dos meLodos: (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor viewFlipsideBackgroundColor]; int r = 9; do { NSLog(@"r's value:%i", r); r /= 3; } while(r != 3); } (void) viewDidAppear: (BOOL) animated { [super viewDidAppear:animated]; BOOL quit = NO;
for(int i = 0;!quit;i++) { NSLog(@"an endless loop without break...%i",i); quit = YES; } } Ll template uLlllLy AppllcaLlon selecclonado crea una apllcacln con dos vlsLas. La prlmera de ellas aparece como prlmera vlsLa de la apllcacln mlenLras que la segunda panLalla aparece al preslonar al boLn de info. La vlsLa prlnclpal es la denomlnada MainView (clase base UIView) y su conLrolador es UIViewController (clase base UIViewController) mlenLras que la segunda es la denomlnada FlipsideView y lleva asoclada un FlipsideViewController. Ll conLrolador de una vlsLa permlLe a un programar e[ecuLar cdlgo cunado su vlsLa va a ser cargada, aparece, desaparece o se descarga Lal y como muesLra la flgura ad[unLa:
Aplicacin bsica de ventana con XCode
xcode, es un luL en el senLldo clslco que nos permlLe organlzar nuesLros flcheros por proyecLos, compllarlos y depurarlos con Lodo Llpo de ayudas y deLalles. LsLa herramlenLa Lraba[a con flcheros !ava (.[ava), C/C++ (.h,.c,.cpp), Cb[ecLlve-C (.h,.m) y Cb[ecLlve-C++ (.h,.mm,.M). Los requlslLos mlnlmos para esLa plaLaforma son: !- Mac CS x 10.3 (Leopard) o posLerlor L_ lhone Suk 2.0 o posLerlor !- ulsposlLlvo mvll para pruebas (opclonal) Ll lhone Suk conLlene el cdlgo, la lnformacln y las herramlenLas necesarlas para desarrollar, probar, e[ecuLar, depurar y a[usLar las apps para el lhone CS. uenLro de esLe klL enconLramos Lres apllcaclones fundamenLales: !xcode: conLlene un con[unLo de herramlenLas para el desarrollo de las apllcaclones, permlLe edlLar, depurar y compllar el cdlgo fuenLe. !lnLerface 8ullder: permlLe la creacln de lnLerfaces grflcas y la vlnculacln con xcode. !lhone SlmulaLor: e[ecuLa las apllcaclones desarrolladas en un emulador del dlsposlLlvo. La slgulenLe flgura muesLra la creacln de un nuevo proyecLo en el enLorno xCode La slgulenLe flgura muesLra la creacln de un nuevo proyecLo en el enLorno xCode
1. Lleglmos por e[emplo la creacln de una apllcacln basada en vlsLas:
2. Como slgulenLe paso declaramos una eLlqueLa (ulLabel) y una funcln (l8AcLlon) en la clase miAppViewController.h #import <UIKit/UIKit.h> @interface miAppViewController : UIViewController { UILabel *miEtiqueta; } @property (nonatomic,retain) IBOutlet UILabel *miEtiqueta; -(IBAction)cambiarEtiqueta; @end 3. ueflnlr la funcln (l8AcLlon) en mlAppvlewConLroller.m" @synthesize miEtiqueta; -(IBAction)cambiarEtiqueta{ miEtiqueta.text = @Bazzinga!; } - (void)dealloc { [miEtiqueta release]; [super dealloc]; } 4. Abrlr con doble cllc el archlvo mlAppvlewConLroller.xlb", agregar una eLlqueLa (ulLabel) y un boLn (ul8uLLon) en la vlsLa del conLrolador
3. Ln la venLana ConnecLlons lnspecLor" arrasLrar mlLLlqueLa hasLa la eLlqueLa creada y la funcln camblarLLlqueLa" hasLa el boLn creado.
6. reslonar en xcode el boLn 8ulld and 8un": La apllcacln se e[ecuLar en el lhone SlmulaLor como lo muesLra la lmagen anLerlor.
Como exLensln de esLe senclllo e[emplo se va a anadlr a conLlnuacln una ulWebvlew que nos permlLe mosLrar conLenldo web embebldo en el dlsposlLlvo mvll. ulWebvlew despllega lnformacln Web embeblda en nuesLra apllcacln sln necesldad de sallr de la mlsma, es declr, el usuarlo puede ver conLenldos Web en la apllcacln sln abrlr Safarl en el dlsposlLlvo. Aunque claramenLe la clase ulWebvlew esL basada en Safarl, no requlere cerrar la apllcacln para mosLrar los conLenldos. La lmplemenLacln es realmenLe sencllla, solo se debe crear un ob[eLo ulWebvlew y cargar el conLenldo web. 1amblen se puede agregar la opcln de avanzar o reLroceder en el hlsLorlal de navegacln. ara ello en nombreAppvlewConLroller.h" declarar los elemenLos: #import <UIKit/UIKit.h> @interface WebAppViewController : UIViewController <UIWebViewDelegate> { IBOutlet UIWebView *webView; IBOutlet UIButton *goBackBtn; IBOutlet UIButton *goForwardBtn; IBOutlet UIButton *reloadBtn; } @end Abrlmos el archlvo nombreAppvlewConLroller.xlb" y agregar los elemenLos declarados prevlamenLe: una ulWebvlew y Lres boLones. Selecclonar el ob[eLo ulWebvlew y desde el lnspecLor ConnecLlons arrasLrar: delegaLe, go8ack, golorward, reload. llnalmenLe en se debe deflnlr la funcln en nombreAppvlewConLroller.m" (void)viewDidLoad { [super viewDidLoad]; NSURL *url = [NSURL URLWithString:@http://www.maestrosdelweb.com]; NSURLRequest *loadURL = [[NSURLRequest alloc] initWithURL:url]; [webView loadRequest:loadURL]; [loadURL release]; }
Al acabar esLe Lema el alumno deberla conocer la esLrucLura en capas que propuso lCS y que hablendo enLendldo la equlvalenLe en Androld debe slmplemenLe saber comparar dada su analogla. or oLro lado se ha querldo dar unas plnceladas del enLorno de desarrollo y de la slnLaxls bslca de Cb[ecLlve-C cmo lengua[e de programacln para apllcaclones en lCS pero dada su comple[ldad no se preLende ms que el alumno lnLeresado dlsponga de una mlnlma base para lnLroduclrse en el desarrollo de lCS y ya en funcln de su lnLeres desarrollar como acLlvldad apllcaLlva una apllcacln ms amblclosa. Como maLerlal complemenLarlo del Lema se ha lncluldo el documenLo de Apple ln Pouse App uevelopmenL AcceleraLor Culde" dlsponlble en esLos momenLos en: hLLp://www.apple.com/fr/lphone/buslness/docs/20110801_ln- house_App_AcceleraLor_Culde.pdf que se LraLa de un excelenLe documenLo LanLo al descrlblr la meLodologla y conslderaclones a Lener en cuenLa a la hora de desarrollar una apllcacln para lCS como para descrlblr el comple[o proceso de llcenclas que ha creado Apple para dlsLrlbulr las apllcaclones creadas en dlsLlnLos casos: desde la dlsLrlbucln a Lraves del Apple SLore hasLa apllcaclones lnLernas para una empresa.
DESARROLLO MULTIPLATAFORMA: ADOBE AIR Y ANSCA CORONA Ln el presenLe Lema nos cenLraremos en dos enLornos de desarrollo mulLlplaLaformas basados en lengua[es de scrlpL que aporLan un enfoque mulLlplaLaforma en el senLldo de que con un unlco desarrollo cubrlmos LanLo la plaLaforma Androld como lCS o lncluso 8lack8erry. LsLa es la opcln que en la oplnln del auLor es la ms recomendable a dla de hoy y como Lal el Lema se ha decldldo cenLrar en dos opclones que aun slendo las dos lenglua[es de scrlpL y las dos mulLlplaLaforma Llenen lmporLanLes dlferenclas de cosLe. Sln duda Adobe ha sldo duranLe la ulLlma decada con sus soluclones basadas en llash layer el auLenLlco domlnador de cualquler desarrollo web blen en apllcaclones desarrolladas en llash o en el menos conocldo llex. LsLe serla el enLono de hecho recomendado por al auLor de esLe maLerlal pero sln duda la batalla enLre Apple y Adobe lleva a Lener que conslderar oLras opclones. or ello adems de la opcln de Adobe basada en su nuevo moLor de apllcaclones Adobe Alr se presenLa una segunda plaLaforma menos conoclda como es Ansca Corona basada en el lengua[e Lua mucho ms esLableclda en el enLorno Apple y de excelenLes presLaclones. Ll alumno desarrollar apllcaclones bslcas en ambas plaLaformas a lo largo de esLe LuLorlal y conocer sus prlnclpales caracLerlsLlcas, sln enLrar en mayor profundldad de[ando para ello la poslbllldad de reallzar una acLlvldad en cualquler de las plaLaformas que se presenLan a lo largo de esLa unldad.
-.'/012&&(3. 410#% 4(/
Adobe Al8 es un moLor de e[ecucln mulLlpanLalla vlldo para Lodos los slsLemas operaLlvos que le permlLe aprovechar sus habllldades de desarrollo web para crear e lmplemenLar apllcaclones enrlquecldas de lnLerneL (8lA) en el escrlLorlo y dlsposlLlvos mvlles. Las apllcaclones de Al8 mvlles, de Lelevlsln y escrlLorlo se pueden crear con AcLlonScrlpL 3.0 uLlllzando Adobe llex y Adobe llash. Las apllcaclones de Al8 de escrlLorlo Lamblen se pueden crear con P1ML, !avaScrlpL y A[ax (basado en P1ML). ara dlsposlLlvos mvlles las apllcaclones Al8 se lmplemenLan como apllcaclones naLlvas. uLlllzan el formaLo de la apllcacln del dlsposlLlvo y no el formaLo de archlvo de Al8. AcLualmenLe Al8 admlLe paqueLes Ak de Androld y paqueLes lA de lCS. una vez creada la versln oflclal del paqueLe de la apllcacln, esLa puede dlsLrlbulrse medlanLe el mecanlsmo de plaLaforma esLndar. ara Androld, esLo suele slgnlflcar Androld MarkeL, para lCS, App SLore de Apple. Se puede emplear el Suk de Al8 y llash rofesslonal, llash 8ullder y oLras herramlenLas de desarrollo de AcLlonScrlpL para crear apllcaclones de Al8 para dlsposlLlvos mvlles. Las apllcaclones de Al8 mvlles basadas en P1ML no se admlLen en el momenLo de crear esLa documenLacln. Ls poslble desarrollar apllcaclones de Al8 con las slgulenLes herramlenLas de desarrollo de la plaLaforma de Adobe llash: ara los desarrolladores de AcLlonScrlpL 3.0 (llash y llex): !Adobe llash rofesslonal (consulLe ubllcacln para Al8) !Suk de Adobe llex 3.x y 4.x !Adobe llash 8ullder Ll Suk de Adobe Al8 conLlene las slgulenLes herramlenLas de la llnea de comandos que se uLlllzan para lnlclar y empaqueLar apllcaclones: Al8 uebug Launcher (AuL) ermlLe e[ecuLar apllcaclones de Al8 sln Lener que lnsLalarlas prlmero Al8 uevelopmenL 1ool (Au1) LmpaqueLa apllcaclones de Al8 en paqueLes de lnsLalacln dlsLrlbulbles Ln lo que slgue uLlllzaremos llex como lengua[e de desarrollo para e[empllflcar el desarrollo de apllcaclones. Como ya ocurrl con lCS y Cb[ecLlve C y posLerlormenLe con Ansca Corona y Lua se ha opLado por lnclulr lnformacln bslca de Lodas esLas opclones de desarrollo en mvlles para ofrecer al alumno una vlsln compleLa del secLor en la acLualldad pero slo en el caso de P1ML3 y Androld se ha decldldo profundlzar. ara conocer llex la me[or referencla es la apllcacln de Adobe de nombre Tour de Flex que se puede descargar de forma graLulLa desde su web. Ll auLor recomlenda esLa opcln como forma de desarrollar apllcaclones para dlsposlLlvos mvlles e lncluso para C como se comenLar a lo largo del Lema pero las dlferenclas enLre Adobe y Apple han llevado a la declsln de cenLrar el aprendlza[e en la plaLaforma de Androld y P1ML3. Desarrollo de una aplicacin mvil en Adobe Air
veremos un e[emplo de creacln de una apllcacln para Androld pero como se ver en los dlsLlnLos pasos del e[emplo la slLuacln es ldenLlca para apllcaclones para lCS o 8lack8erry. Ll prlmer paso es descargar una versln de evaluacln de llash 8ullder 4.3.1 o posLerlor y una vez lnsLalado crear un nuevo proyecLo para dlsposlLlvos mvlles Lal y como muesLra la flgura ad[unLa.
Ln el slgulenLe paso selecclonamos las opclones que muesLra la panLalla ad[unLa y en las opclones para la apllcaclones permlLlremos que se conecLe a lnLerneL que es la opcln por defecLo aunque en el e[emplo a desarrollar no ser necesarlo. lgualmenLe de[amos las opclones por defecLo de la pesLana Server SeLLlngs" pues no lnLegraremos la apllcacln con nlnguna solucln de servldor.
lgualmenLe en esLe e[emplo de[amos las opclones por defecLo de la pesLana Build Paths. una vez selecclonadas esLas opclones llash 8ullder crea la base del proyecLo llex cuyos elemenLos podemos consulLar en la vlsLa del proyecLo en la parLe lzqulerda del lnLerfaz de la herramlenLa
Los elemenLos prlnclpales del proyecLo son: !HelloWorld.mxml. Ls el flchero prlnclpal de la apllcacln que normalmenLe no edlLaremos nunca !HelloWorldHomeView.mxml. Ls la vlsLa por defecLo de la apllcacln, la prlmera que se carga. Cmo puede apreclarse se crea auLomLlcamenLe en la carpeLa vlews y que modlflcaremos de la manera que se lndlca a conLlnuacln: <?xml version="1.0" encoding="utf-8"?> <s:View xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" title="HomeView"> <fx:Declarations> <!-- Place non-visual elements (e.g., services, value objects) here --> </fx:Declarations> <s:VGroup width="100%" height="100%" verticalAlign="middle" horizontalAlign="center"> <s:Label text="Hello World"/> <s:Button label="Continuar" click="navigator.pushView(MyNewView)" styleName="next"/> </s:VGroup> </s:View> Ln esLe momenLo la compllacln del proyecLo dar un error pues no esLa deflnlda la vlsLa Mynewvlew" que esLamos declarando que ser la vlsLa que mosLrar la apllcacln cuando se hace cllck en el elemenLo Button deflnldo. Ll slgulenLe paso ser crear esa vlsLa. ara ello uLlllzando el menu conLexLual (boLn derecho del raLn en la carpeLa vlews) deflnlmos una nueva vlsLa con nombre MyNewView selecclonado new > MxML ComponenLe Lal y como muesLra la flgura ad[unLa.
Ll cdlgo compleLo de esLa nueva vlsLa ser: <?xml version="1.0" encoding="utf-8"?> <s:View xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark" title="MyNewView"> <fx:Declarations> <!-- Place non-visual elements (e.g., services, value objects) here --> </fx:Declarations> <s:VGroup width="100%" height="100%" verticalAlign="middle" horizontalAlign="center"> <s:Label text="Siguiente Pantalla"/> <s:Button label="Volver" click="navigator.popView()" styleName="back"/> </s:VGroup> </s:View> Ln esLe caso como se observa se crea Lamblen un grupo de elemenLos vlsuales que se poslclonarn verLlcalmenLe. 1amblen como anLes el prlmero de los elemenLos es una ca[a de LexLo y el boLn que reallzar la funcln de volver a la vlsLa anLerlor como puede verse se declara con el esLllo back" y al lgual que anLerlormenLe para pasar de vlsLa uLlllzbamos el meLodo pushView para volver lo que haremos ser descargar la vlsLa acLual con el meLodo complemenLarlo popView. ?a Lenemos suflclenLe para probar la apllcacln. ara ello selecclonamos el nombre del proyecLo en la venLana Package Explorer" y con el boLn derecho selecclonamos Run as > Mobile Application" dando paso a la slgulenLe venLana:
vemos que la opclones de dlsposlLlvos para probar la apllcacln en el ordenador es especlalmenLe amplla con Lodo Llpo de marcas y modelos. Selecclonamos cualqulera de ellas y la herramlenLa AuL es lanzada para slmular el comporLamlenLo de la apllcacln desarrollada.
ara probar la apllcacln en un dlsposlLlvo Androld flslco y Lal como se vlo en el Lema dedlcado a Androld debemos asegurarnos que la opcln de USB debugging mode esLa acLlva en nuesLro dlsposlLlvo (en la panLalla de conflguracln > apllcaclones > desarrollo). Al conecLar el dlsposlLlvo al equlpo selecclonaremos monLarlo" como un unldad de dlsco. una vez dlsponlble el dlsposlLlvo Androld como unldad de dlsco selecclonaremos la opcln 8un ConflguraLlons" en el menu conLexLual del proyecLo y selecclonaremos como Launch MeLhod" la opcln Cn devlce" en lugar de la opcln Cn deskLop". Ls probable que el dlsposlLlvo al lanzar la apllcacln sollclLe una acLuallzacln de Adobe Al8 en cuyo caso slmplemenLe debemos permlLlr Lal acLuallzacln. uesLacar por ulLlmo la opcln ro[ecL > LxporL 8elease 8ulld" que permlLe crear la apllcacln empaqueLada de forma que por e[emplo pueda enLregarse en el Androld MarkeL. Al lgual que en el caso de apllcaclones naLlvas de Androld para reallzar el proceso es necesarlo sollclLar un cerLlflcado o flrma dlglLal de una Lercera empresa pero a efecLo de LesL podemos crear nuesLro proplo cerLlflcado que se almacenar en el dlrecLorlo deseado con exLensln .p12. Sl flnallzamos el proceso en esLe momenLo en el mlsmo dlrecLorlo que el proyecLo sl no se ha selecclonado nada en concreLo el paqueLe de lnsLalacln HelloWorld.apk.
or ulLlmo modlflcaremos el proyecLo para probarlo en lCS. ara ello selecclonamos la opcln roperlLes en el menu conLexLual del proyecLo y hablllLamos lCS como plaLaforma de publlcacln Lal y como muesLra la flgura ad[unLa y selecclonamos Ck Las opclones de slmular la apllcacln en lpad y dlsLlnLas verslones de lphone ya aparecen dlsponlbles y el comporLamlenLo sl selecclonamos la opcln de slmular en el enLorno Desktop son ldenLlcas. Ll problema para slmular en un dlsposlLlvo lCS real es la necesldad de dlsponer de un cerLlflcado de desarrollo de Apple. ara ello es necesarlo un flrma dlglLal .p12 vllda y el denomlnado Provisioning File o flchero de aprovlslonamlenLo que se genera desde el porLal del desarrollador de Apple a parLlr de los cerLlflcados asoclados a la cuenLa de desarrollador Apple, en un proceso ms comple[o del hablLual para los no lnlclados (especlalmenLe sl se Llene en cuenLa que son dlsLlnLos proceso en funcln de sl la apllcacln Llene como publlco ob[eLlvo cualquler usuarlo o una empresa que adems conLempla LanLo dlsLrlbucln adHoc como dlsLrlbucln inHouse slgulendo la nomenclaLura de Apple). Uso de Skins en Adobe Air una de las me[oras ms slgnlflcaLlvas desde la aparlcln de llex 2 hasLa las verslones de la fecha de crear esLe documenLo ha sldo el lncremenLo de flexlbllldad y poLencla de desarrollo que permlLen los denomlnados skins en la llnea de separacln de conLenldo y presenLacln de la que LanLa lnslsLencla se hlzo en la unldad de aprendlza[e dedlcada a P1ML3. ara ver un e[emplo es necesarlo descargar del maLerlal complemenLarlo el flchero de sklns PelloWorldSklns.zlp que exLraeremos en una carpeLa cualqulera e lmporLaremos en llash 8ullder con la opcln llle > lmporL llash 8ullder ro[ecL" dlsponlble en el menu prlnclpal de la apllcacln, que lmporLaremos como nueva copla en el proyecLo. Selecclonaremos el flchero maln.css de esLe nuevo proyecLo y lo arrasLramos al anLlguo Lal y como muesLra la flgura ad[unLa:
A conLlnuacln creamos un nuevo paqueLe con el menu conLexLual Lal y como muesLra la flgura ad[unLa.
Ln la que arrasLraremos los flcheros de sklns del segundo proyecLo lmporLado relaLlvos a los boLones (BackButtonSkin1, BackButtonSkin2, NextButttonSkin1 y NextButttonSkin2). Cmo ulLlmo paso modlflcamos el cdlgo del componenLe prlnclpal de la apllcacln PelloWorld.mxml" Lal y como se muesLra en el cdlgo ad[unLo: <?xml version="1.0" encoding="utf-8"?> <s:ViewNavigatorApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark" firstView="views.HelloWorldHomeView"> <fx:Declarations> <!-- Place non-visual elements (e.g., services, value objects) here --> </fx:Declarations> <fx:Style source="main.css"/> </s:ViewNavigatorApplication>
Sl en esLe momenLo edlLamos el flchero maln.css deberlamos Lener el slgulenLe conLenldo. /* CSS file */ @namespace s "library://ns.adobe.com/flex/spark"; s|Button.next { skinClass: ClassReference("skins.NextButtonSkin1"); } s|Button.back { skinClass: ClassReference("skins.BackButtonSkin1"); } ? el resulLado es el slgulenLe:
ue[ando al lecLor probar con los oLros dos sklns proporclonados adems de los presenLados. ara ello basLa con camblar en el flchero maln.css mosLrado de NextButtonSkin1 y BackButtonSkin1 a las verslones numeradas con el 2.
Introduccin a Ansca Corona y Lua Ansca Corona medlanLe su Corona Suk permlLe crear apllcaclones naLlvas para lPone y Androld. Las apllcaclones son a nlvel de lnLerfaz y comporLamlenLo ldenLlcas a las apllcaclones consLruldas sobre el dlsposlLlvo permlLlendo acceso compleLo a caracLerlsLlcas del mlsmo como pueden ser la cmara o el acelermeLro o a lnLerfaces como CpenCL. La programacln de esLas apllcaclones se reallzar en Lua, un lengua[e de scrlpL lnLulLlvo y senclllo y de alLlslmas presLaclones. 8especLo de Lua slmplemenLe comenLar que se desarrollo en el ano 1983 como lengua[e de scrlpL que puede ser lnLegrado fcllmenLe con lengua[e C apoyndose en el para funclones de ba[o nlvel y ofreclendo un marco de alLo nlvel para el desarrollador en el que funclones como la segurldad, la gesLln de memorla y de varlables de Lamano varlable son gesLlonadas auLomLlcamenLe. La poLencla de Lua vlene de sus mulLlples llbrerlas, desarrolladas duranLe anos con gran facllldad al ser la exLenslbllldad uno de sus punLos fuerLes al esLar dlsenado desde el lnlclo para su creclmlenLo blen a Lraves de nuevas llbrerlas escrlLas en Lua o a parLlr de cdlgo en C. ero no slo con C. Lua puede ser lnLegrado con oLros lengua[es de programacln como lorLran, !ava, SmallLalk, Ada, C#, o lncluso con oLros lengua[es de scrlpL como erl o 8uby. Sus oLras prlnclpales caracLerlsLlcas son: Simplicidad. Aun slendo un lengua[e compleLo que lo convlerLe en un enLorno de programacln ldeal para dlsposlLlvos embebldos como son los Lermlnales mvlles, al ocupar su dlsLrlbucln compleLa menos que un dlsco de 1.4 Mb, hablLuales cuando fue desarrollado. !Eficiencia. Ln los dlsLlnLos LesL reallzados sobre lengua[es de scrlpL slempre ocupa una de las prlmeras poslclones lo que unldo a su escasa dlfusln en comparacln con la solucln de Adobe lleva a una mayor Lranqullldad respecLo de la acepLacln por parLe de Apple de las apllcaclones desarrolladas con Lua. !Portabilidad. uesde enLornos Wlndows, Llnux, Mac pasando por Symblan, alm, lCS, Androld, procesadores A8M, eLc sln necesldad de compllacln condlclonal.
Ejemplo de aplicacin Ansca Corona una vez descargado el Suk de Corona slo es necesarlo un edlLor de LexLo plano para reallzar la prlmera apllcacln. Se recomlenda usar por e[emplo el sofLware noLepad++. ara hacer la clslca apllcacln Pola mundo", slo es necesarlo escrlblr en nuesLro edlLor de LexLo: print( "Hello World" ) ? guardarlo con el nombre main.lua. ara e[ecuLarlo es necesarlo e[ecuLar el programa denomlnado Corona Simulator y arrasLrar sobre el emulador el flchero .lua creado de manera que se obLlene el slgulenLe resulLado en el Lermlnal de emulacln:
A la vez el Lermlnal de emulacln no mosLrar nada por el momenLo. ara que la sallda aparezca en el Lermlnal e8l cdlgo es lgualmenLe senclllo pero ya neceslLamos consLrulr ob[eLos del Suk. Asl haremos: local textObject = display.newText( "Hello World!", 50, 50, nil, 24 ) textObject:setTextColor( 255,255,255 ) or e[emplo en esLe caso se ha de llamar a la funcln newText de la llbrerla display y con ob[eLo LexLCb[ecL devuelLo, uLlllzamos uno de sus meLodos denomlnado seL1exLColor para esLablecer en blanco el color del LexLo. odemos blen cerrar el emulador y volver a abrlr main.lua medlanLe doble cllck, volver a arrasLrarlo o me[or aun uLlllzar el menu llle > 8elaunch (C18L + 8 en Wlndows) para ver de nuevo el resulLado que se muesLra a conLlnuacln. Slgulendo con el LuLorlal bslco de Corona vamos a anadlr a conLlnuacln un boLn para mosLrar como funclona la capa de lnLerfacLlvldad: local button = display.newImage( "button.png" ) button.x = display.stageWidth /2 button.y = display.stageHeight 50 ara lo cual neceslLamos una lmagen que nos slrva como boLn y que en el e[emplo se denomlna buLLon.png-. ? para asoclar el mane[ador del evenLo Lap" (cuando el usuarlo acaba de preslonar el boLn) se anade el slgulenLe cdlgo: function button:tap( event ) local r = math.random( 0, 255 ) local g = math.random( 0, 255 ) local b = math.random( 0, 255 ) textObject:setTextColor( r, g, b ) end
button:addEventListener( "tap", button )
? en esLe e[emplo de esLa manera cambla el color del LexLo de manera aleaLorla cuando el usuarlo hace tap sobre el boLn. LsLe e[emplo [unLo con muchos oLros vlenen dlrecLamenLe con la lnsLalacln del Suk y se pueden locallzar, por e[emplo en la lnsLalacln del auLor en: C:\Archlvos de programa\Ansca\Corona Suk\Sample Code\1uLorlal\ApprogrammlngCulde \PelloWorld2: Ansca Corona esL aunque permlLe reallzar Lodo Llpo de apllcaclones esL especlalmenLe dlsenador para proyecLos mulLlmedla y [uegos donde su Al es especlalmenLe compleLa. Asl por e[emplo, para desplazar el LexLo en panLalla es suflclenLe con anadlr la slgulenLe llnea de cdlgo: transition.to( textObject, { time=1000, y=textObject.y+100 } ) uLlllzando la llbrerla transition que conLlene gran varledad de Lranslclones muy slmllares en comporLamlenLo a las hablLuales Lranslsclones que esLamos hablLuados a mane[ar en apllcaclones naLlvas de Apple. lgualmenLe para anadlr la reproduccln de un sonldo a hacer tap basLa con anadlr en nuesLra funcln function button:tap( event ) la slgulenLe llnea de cdlgo: media.playEventSound( "beep.wav" ) LsLe e[emplo se encuenLra en: C:\Archlvos de programa\Ansca\Corona Suk\Sample Code\1uLorlal\ApprogrammlngCulde\PelloWorld3 en la lnsLalacln del auLor. Ln Lodos esLos e[emplos proporclonados con el Suk pueden verse mulLlples flcheros adems del flchero .lua menclonado. 8slcamenLe son los lconos necesarlos para desplegar la apllcacln LanLo en Androld como en lCS. or e[emplo el lcono de la apllcacln debe Lener el nombre Icon.png de resolucln 37x37 plxeles (el App SLore neceslLa Lamblen un lcono de 312x312 plxeles). CLro recursos lmporLanLe es el flchero uefaulL.png que se mosLrar duranLe la lnlclallzacln de la apllcacln. Adems de recursos, ara permlLlr un desarrollo ms modular Lua permlLe lnclulr dlsLlnLos flcheros .lua que se relaclonan unos con oLros a Lraves de la palabra reservada require. or e[emplo podemos crear una subcarpeLa class donde anadlr la funclonalldad relaclonada con dlsLlnLas Lareas de nuesLra apllcacln como puede ser la carga de un flchero xML exLerno. ongamos que esLa funclonalldad se lmplemenLa en un flchero con nombre xml.lua. La llamada que ha de hacerse desde main.lua serla: local xml = require( "class.xml" ).newParser(); ? en el flchero class.xml se Llene el slgulenLe cdlgo para crear la clase desLlnada a parsear xML module(..., package.seeall) function newParser() XmlParser = {}; function XmlParser:ToXmlString(value) ... end function XmlParser:loadFile(xmlFilename, base) ... end Return XmlParser end
Consideraciones globales sobre una aplicacin Corona Cuando la apllcacln es lanzada enLra en un clclo de evenLos / plnLado en los que los evenLos lanzas triggers a los que podemos Lener asocladas funclones o no. LnLre esos evenLos exlsLen evenLos globales como el plnLado de un nuevo cuadro (frame), llamadas o SMS, enLrada en reposo del dlsposlLlvo o lncluso el evenLo applicationExit (cuando el usuarlo pulsa el boLn Pome y sale de la apllcacln) que es especlalmenLe lmporLanLe para en ese momenLo guardar daLos de usuarlo, llmplar flcheros Lemporales o mane[ar casos slmulares. or e[emplo el slgulenLe cdlgo gesLlona un camblo de orlenLacln de la panLalla (-- slrve para lnclulr comenLarlos en Lua) local label = display.newText( "portrait", 0, 0, nil, 30 ) label:setTextColor( 255,255,255 ) label.x = display.stageWidth/2; label.y = display.stageHeight/2 local function onOrientationChange( event ) label.text = event.type -- rotar el texto local newAngle = label.rotation - event.delta transition.to( label, { time=150, rotation=newAngle } ) end Runtime:addEventListener( "orientation", onOrientationChange ) or razones de segurldad las apllcaclones se e[ecuLan en su proplo sandbox. LsLo lmpllca que las apllcaclones Llenen acceso llmlLado a la red y a los proplos flcheros. Asl puede acceder a los flcheros de un slsLema de dlrecLorlos asoclados a la propla apllcacln pero no a los de oLra lnsLancla o apllcacln. 8especLo del lnLerfaz grflco y de anlmaclones de Corona, que como se ha comenLado es uno de sus prlnclpales vlrLudes, comenLar que permlLe como en el caso de los ms populares enLornos de anlmacln reallzar anlmaclones basadas en duraclones especlflcadas en segundos o basndose en el numero de frame. La dlferencla enLre un caso y oLro es que las anlmaclones basadas en el Llempo LraLan de e[ecuLarse en ese perlodo lndependlenLemenLe de la velocldad de frame, mlenLras que en el caso de basarse en el numero de frame se e[ecuLar en ese frame concreLo que puede llevarle al dlsposlLlvo ms o menos Llempo alcanzar dado que las apllcaclones no slempre se e[ecuLarn a la velocldad deseada pues slempre depender de cuanLo de ocupado esLe el slsLema operaLlvo. 8especLo del proceso de crear un exporLar un proyecLo Corona a un dlsposlLlvo flslco comenLar dos aspecLos lmporLanLes. or un lado acompanando al flchero main.lua nos enconLramos con el flchero config.lua. Ln esLe flchero enconLramos cdlgo cmo: application = { content = { width = 320, height = 480, scale = "zoomEven" -- zoom hasta llenar pantalla }, } Ln esLe e[emplo se deflne la relacln de aspecLo lnlclal de la apllcacln como 320x480 plexles y se lndlca que se puede escalar medlanLe el evenLo de zoom hasLa llenar la panLalla. Sl conslderamos un e[emplo ms comple[o desarrollado por el auLor: application = { content = { width = 768, height = 1024, scale = "Letterbox",
fps = 30, antialias = true, }, Se deflne que la apllcacln parLe de una resolucln de 768x1024 plxeles pero que en esLe caso anLe un evenLo de escalado la apllcacln va a esLar llmlLada a la panLalla de[ando fran[as negras en donde no llegue a ocuparse la panLalla (leLLerbox). lgualmenLe en esLe e[emplo se ve como se han uLlllzado las opclones de fps para especlflcar la velocldad en frames por segundo deseada para la apllcacln y que el modo de renderizado de LexLo ser usando fllLros antialiasing. Ll flchero que complemenLa la conflguracln y que slo enLra en [uego para la exporLacln a un dlsposlLlvo flslco es el flchero bulld.seLLlngs que puede edlLarse con cualquler edlLor de LexLo plano. or e[emplo, en las apllcaclones PellowWorld lncluldas en el Suk nos enconLramos con: settings = { iphone = { plist = { CFBundleIconFile = "Icon.png", CFBundleIconFiles = { "Icon.png", "Icon@2x.png", "Icon-72.png", }, }, } }
Ln el que se deflnen para lhone una serle de recursos. Ln camblo en el e[emplo asoclado al proyecLo desarrollado por el auLor se Llenen opclones ms avanzadas que se lncluyen como e[emplo de lo que el Suk de Corona permlLe: settings = { orientation = { default = "landscapeLeft", supported = {"landscapeLeft"}, }, iphone = { plist = { UIApplicationExitsOnSuspend = true, UIPrerenderedIcon = false, CFBundleIconFile = "Icon.png", CFBundleIconFiles = {"Icon.png"}, UIAppFonts = {"corporate.otf"} Ln esLe e[emplo se deflne para cualquler Llpo de dlsposlLlvo que la unlca orlenLacln soporLada para la apllcacln es en modo horlzonLal desde el lado lzqulerdo de la panLalla. ? mlenLras que slo se proporclona un lcono para la apllcacln se anade la fuenLe por defecLo a usar (recordar que anLerlormenLe se habla lndlcado que esLa fuenLe es usada en modo antialias) que es la fuenLe corporaLlva del cllenLe flnal de la apllcacln. Ln esLe caso no se neceslLan de LanLos lconos pues la apllcacln reallzada se dlsLrlbuye en modo inHouse que es la denomlnacln de Apple para apllcaclones que se dlsLrlbuyen fuera del Apple SLore slgulendo el modelo de llcenclas corporaLlvas. A lo largo de esLe Lema se han presenLado pequenas lnLroducclones a las plaLaformas de Adobe y Ansca Corona para el desarrollo de apllcaclones mvlles mulLlplaLaforma. Como se comenL en la presenLacln del Lema esLos lengua[es de scrlpL son ldeales en la oplnln del auLor para desarrollar apllcaclones senclllas y en concreLo Adobe ha pasado anos demosLrndolo con una poslcln de absoluLo predomlnlo en el secLor de las apllcaclones web. Ln camblo el enfrenLamlenLo enLre Adobe y Apple ha camblado la slLuacln y es necesarlo conslderar oLras opclones como Ansca Corona que slrve para los mlsmos propslLos y sobre Lodo P1ML3. Se anlma en cualquler caso al alumno a profundlzar en el esLudlo de llex, sln duda y slempre en oplnln del auLor la me[or plaLaforma para el desarrollo de apllcaclones senclllas y que no requleran de presLaclones elevadlslmas que se ha desarrollado en los ulLlmos dlez anos.