You are on page 1of 43

APLICACIONES IOS

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
&lt;UIWebViewDelegate&gt; {
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.