HISTÒRIES PER A MENUTS II. CRA Serra del Benicadell.pdf
Introducció al desenvolupament d’aplicacions per a i os ctug
1. Introducció al desenvolupament
t oducc ó a dese o upa e t
d’aplicacions per a iOS
Enric Farguell Matesanz – DI
efarguell@salle.url.edu
2. Continguts
Què ensenyarem en aquest curs?
Introducció al desenvolupament d’aplicacions per a iPhone –
Historia, estat de l’art i conceptes.
Fonaments d l d
F de la distribució d’aplicacions.
b ó d’ l
Eines de desenvolupament: Xcode i Interface Builder (IB).
Classes UIL b l i UIB
Cl UILabel UIButton a través de IB.
é d IB
Classe NSTimer: control de temps a la aplicació.
Hands
H d on coding: creació d’un petit joc amb tots els elements
di ió d’ tit j bt t l l t
anteriors.
3. Continguts
Índex
Introducció al desenvolupament d’aplicacions per a iPhone –
Historia, estat de l’art i conceptes.
Fonaments d l d
F de la distribució d’aplicacions.
b ó d’ l
Eines de desenvolupament: Xcode i Interface Builder (IB).
Classes UIL b l i UIB
Cl UILabel UIButton a través de IB.
é d IB
Classe NSTimer: control de temps a la aplicació.
Hands
H d on coding: creació d’un petit joc amb tots els elements
di ió d’ tit j bt t l l t
anteriors.
4. Introducció - iPhone
Presentació de l’iPhone el Gener de 2007 (a la venda en
Juny)
Va revolucionar la telefonia mòbil
Interfície multitàctil
Sistema Operatiu
Estètica
AppStore
Accessoris
5. Introduccíó - iPod Touch
Presentat el Setembre de 2007
Similar a l’iPhone
Mateix hardware base (sense telèfon ni GPS)
Mateix sistema operatiu
Més barat i accessible
6. Introducció - iPhone + iPod
Actualment més de 120 milions de dispositius venuts
AppStore + iTunes: vendes centralitzades
Més de 240.000 aplicacions disponibles
p p
Més de 4000 milions de descàrregues
Inesperada plataforma de jocs
7. Introducció - iPad
A la venda el 3 d’abril de 2010 en USA
Basat en iOS
Accessoris d’Apple (Teclat, SD-Card, USB, adaptador
pp ( p
VGA...)
Abans de la distribució ja va suposar una revolució
j p
(tabletes Android)
Més d’un milió d’unitats venudes en 28 dies
Més de 20.000 Apps natives
8. Continguts
Índex
Introducció al desenvolupament d’aplicacions per a iPhone –
Historia, estat de l’art i conceptes.
Fonaments d l d
F de la distribució d’aplicacions.
b ó d’ l
Eines de desenvolupament: Xcode i Interface Builder (IB).
Classes UIL b l i UIB
Cl UILabel UIButton a través de IB.
é d IB
Classe NSTimer: control de temps a la aplicació.
Hands
H d on coding: creació d’un petit joc amb tots els elements
di ió d’ tit j bt t l l t
anteriors.
9. Distribució d’aplicacions
d aplicacions
Distribució de software iOS
Tipus de llicència i de distribució (Ad-Hoc, AppStore)
Desenvolupament en:
Objective-C
Flash
Provisionat d dispositius
P ii de di ii
Identificador únic: UDID
Claus i certificats
Cl ifi
10. Distribució - iPhone 3 x
3.x
Característiques destacades:
Mac OS X empotrat
Llibreries estándard
Programable en C C++ Objective C
C, C++, Objective-C...
Optimitzat per al dispositiu
Novetats de la versió:
Compra de continguts
Connectivitat simplificada
p
Notificacions PUSH
Mapes y geolocalització
Control d’accesoris
Més de 1000 APIs noves
11. Distribució - iPhone 3 x
3.x
Limitacions imposades:
Accés només a alt nivell
Intèrprets programables (Java, Flash, C64...)
Multitasca no permesa
Rendiment
Seguretat
S
Limitacions distribució AppStore, a afegir
Usabilitat disseny
U bili i di
La distribució Ad-Hoc no limita
12. Distribució - iPhone 4 x
4.x
Novetats:
iPhone OS canvia a iOS
Multitasca
iAd
Game Center
Millor interfície d’usuari
d usuari
Mail millorat
Empresa:
p
Millor seguretat
Apps via WiFi i 3G
Gestió de dispositius
Més de 1.500 APIs noves
13. Continguts
Índex
Introducció al desenvolupament d’aplicacions per a iPhone –
Historia, estat de l’art i conceptes.
Fonaments d l d
F de la distribució d’aplicacions.
b ó d’ l
Eines de desenvolupament: Xcode i Interface Builder (IB).
Classes UIL b l i UIB
Cl UILabel UIButton a través de IB.
é d IB
Classe NSTimer: control de temps a la aplicació.
Hands
H d on coding: creació d’un petit joc amb tots els elements
di ió d’ tit j bt t l l t
anteriors.
14. Eines de desenvolupament
Dashcode
Disseny web natiu, no accedeix a perifèrics
XCode 3 - 4
Codi Obj-C, C, C++
Interface Builder (integrat XCode 4)
( g )
Disseny assistit: WYSIWYG
Instruments
Eina de depuració i detecció de fallades de memòria
15. Descripció de l’Objective C
l Objective-C
Mètode:
Pot ser:
Dirigit a una classe (mètode de classe): no cal tenir un objecte
instanciat en memòria
Dirigit a una instància (mètode d’instància): em dirigeixo a un objecte
en memòria
Els mètodes es criden com a missatges
El format és:
[receptor missatge];
Amb paràmetres:
[receptor missatge: (tipus1) par1 missatgePar2: (tipus2) par2];
16. Classes: interfície i implementació
Per a crear una classe necessito una interfície i una implementació:
Interfície: estudiant h
estudiant.h
Implementació: estudiant.m
Per a definir les funcions he de fer:
Funcions d classe:
F de l
+(tipusDeRetorn)nomFuncio;
Funcions d’instància:
-(tipusDeRetorn)nomFuncio;
La sintaxi de la interfície és:
@
@interface NomClasse: PareDelQueHereto {
// Declaració de variables membre
}
// Declaració de mètodes
@end
Si no em cal heretar de cap altre classe, he d’heretar de NSObject
17. Classes: interfície i implementació
La implementació és l’arxiu .m
La i
L sintaxi é
i és:
@implementation NomClasse
// Implementació dels mètodes
@end
La implementació dels mètodes segueix la sintaxi:
p g
Per a funcions de classe:
+(tipusDeRetorn) nomFuncio: (tipus1){
//Implementació de la funció
}
Per a funcions d’instància:
-(tipusDeRetorn) nomFuncio: (tipus1){
//Implementació de la funció
}
18. Exemple 1
Crea un projecte tipus View-based
Sobre l’arxiu NomProjecteAppDelegate.c, busca la funció:
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
Dins d’aquesta funció, posa-hi:
NSLog(@”Hello from didFi i h”)
NSL (@”H ll f didFinish”);
Sobre l’arxiu NomProjecteViewController.c, busca la funció:
-(void)viewDidLoad
Dins d’aquesta funció, posa-hi:
NSLog(@”Hello from viewDidLoad”);
Compila, executa i mira què surt per la consola
19. Exemple 2
Sobre el projecte anterior
Sobre l’arxiu NomProjecteAppDelegate.h, posa-hi la capçalera:
-(void) saySomething:(NSString*) aString;
Sobre l arxiu NomProjecteAppDelegate c implementa la funció:
l’arxiu NomProjecteAppDelegate.c,
-(void) saySomething:(NSString*) aString{
NSLog(aString);
g( g)
}
Busca la funció:
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
Fes la crida:
[self saySomething:@”Hello world.”];
20. Exemple 3
Sobre el projecte anterior
Sobre l’arxiu NomProjecteViewController.h, posa-hi la capçalera:
-(void) saySomething:(NSString*) aString;
Sobre l arxiu NomProjecteViewController h implementa la funció:
l’arxiu NomProjecteViewController.h,
-(void) saySomething:(NSString*) aString{
NSLog(aString);
g( g)
}
A l’arxiu NomProjecteAppDelegate.c, busca la funció:
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
Fes la crida:
[viewController saySomething:@”Hello from viewController.”];
21. Iniciat d’objectes
d objectes
Tots els objectes es declaren com a punters en Obj-C
meuOjbecte *
Ojb *mevaVariable;
V i bl
Per tant, sempre cal demanar memòria per a un objecte quan
el volem fer servir:
mevaVariable=[meuObjecte alloc];
alloc és funció de classe, no d’instància: +(id) alloc;
alloc només demana memòria i inicia a zero.
S’ha d’iniciar els objectes amb una funció que sempre comença
amb init:
El mètode init està implementat a NSObject per defecte.
Es pot sobreescriure, però és recomanable crear un inicialitzador
p p
que comenci amb la paraula init.
El retorn de qualsevol funció init és sempre id, per si alguna classe
que hi hereti necessita treballar amb un tipus de dades diferent
diferent.
22. Gestió de memòria
La memòria pels objectes es demana amb alloc
alloc ve implementat per defecte des de NSObject
Per a poder alliberar memòria, cal crear dealloc
Aquesta rutina no està implementada per defecte a les classes
pròpies.
A diferència d’alloc és mètode d’instància:
d alloc, d instància:
-(void) dealloc
{
//Alliberem tots els objectes per als que haguem demanat memòria.
//Alliberem el mètode pare.
[super dealloc];
}
Cal crear un dealloc, encara que només sigui per a alliberar el pare!
23. Declaració de propietats
L’accés a les variables pròpies d’una classe es fa a partir de les
propietats
Les propietats es van incloure recentment per a aconseguir
operacions que antigament requerien molt de codi; realment el
i ti t i lt d di l t l
que fan és implementar un setter i un getter
El setter dóna un valor a la variable
El getter llegeix el valor de la variable
En general, les variables pròpies d’una classe d’Obj-C, reben el
d una d Obj C,
nom de propietats, i per a cada objecte declarat dins la classe
caldrà definir-les
La sintaxi és:
@property (atribut1, atribut2, ...) tipus nomVariable;
24. Declaració de propietats
Les propietats es divideixen en:
De modificació de setter i getter: per defecte, el getter és el nom de la propietat i el setter és
g p , g p p
setNomPropietat. La sintaxi és:
setter=nomSetter
getter=nomGetter
D assignació
D’assignació (mutuament excloents):
readwrite: de lectura i escriptura, és el valor per defecte
readonly: només de lectura
Del setter (mutuament excloents):
assign: copia directament la informació d’una variable a la altra
copy: copia la informació i allibera el valor anterior de la variable
retain: copia la informació i allibera el valor anterior de la variable, la variable actual ha de fer un
retain
D’atomicitat
atomic: la execució del setter i el getter no es pot interrompre per cap altre fil en l’entorn multifil
d’un S.O. És el valor per defecte
non-atomic: la execució es pot interrompre, però també és molt més ràpid
p p p p
Algunes propietats només funcionen amb objectes i no amb POD (Plain, Old Data)
25. Exemple 4
Sobre el projecte anterior
A la interfície de NomProjecteViewController:
Declara NSString *texteAPintar;
Defineix les seves propietats:
@property(nonatomic, retain)NSString *texteAPintar;
A la implementació fes:
@synthesize texteAPintar;
Sobre la funció saySomething, afegim una mica de codi:
-(void) saySomething:(NSString*) aString{
NSLog(aString);
g( g);
NSLog(texteAPintar);
}
A l’arxiu NomProjecteAppDelegate.c, busca la funció:
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
Implementa aquestes línies de codi:
viewController.texteAPintar=@ I
viewController texteAPintar=@”I use a NSString property”;
property. ;
[viewController saySomething:@”Hello from viewController.”];
Prova: [viewController saySomething:[NSString stringWithString:@”Hello from viewController.”]];
26. Continguts
Índex
Introducció al desenvolupament d’aplicacions per a iPhone –
Historia, estat de l’art i conceptes.
Fonaments d l d
F de la distribució d’aplicacions.
b ó d’ l
Eines de desenvolupament: Xcode i Interface Builder (IB).
Classes UIL b l i UIB
Cl UILabel UIButton a través de IB.
é d IB
Classe NSTimer: control de temps a la aplicació.
Hands
H d on coding: creació d’un petit joc amb tots els elements
di ió d’ tit j bt t l l t
anteriors.
27. UIView
Desenvolupar per a iOS implica treballar amb vistes.
La vista és el que es mostra per pantalla.
Es poden tenir vistes múltiples sobre la pantalla, a forma de
stack.
stack
La vista que es veu és la primera, la resta es superposen.
Totes les classes que hereten de UIView poden rebre
otes es c asses e ete e U V ew po e eb e
crides a funcions de UIView.
Les classes de UIView pertanyen al UIKit Framework.
COCOA inclou per defecte UIKit.
UILabel i UIButton hereten de UIView, i inclouen d’altres
variables interenes d’altres tipus.
d altres tipus
Si ho busqueu al help d’Apple, assegureu-vos de buscar-ho
a la SDK de iOS, i no a la de Mac OS!
28. UIView
Interface Builder (IB) és una eina WYSIWYG.
Permet disposar qualsevol classe que hereta de UIVie a la
dis sar alse l e UIView
pantalla de la App.
Tot el que es pot fer amb IB es pot fer p g
q p p programàticament.
NO es recomana treballar amb els controladors alhora amb IB i
programàticament, ja que el codi generat per IB no és accessible.
Per a obrir la aplicació IB cal prèmer sobre l’arxiu
p p
NomAppViewController.xib; aquesta és la vista editable per IB.
NO treballeu amb el MainWindow.xib; no funciona!
Salveu l’arxiu XIB en acabar la edició...
l arxiu
Per a referenciar un objecte pintat a l’IB des del codi s’usa la
macro IBOutlet.
Per
P a referenciar una f ió relacionada a un element a través
f i funció l i d l é
d’IB s’usa la macro IBAction.
29. UILabel i UIButton
UILabel és una classe que permet mostrar camps de text
com a etiquetes:
Es pot canviar el seu contingut com a camp de text: té una
propietat i
i interna que é text, d l tipus NSS i
és del i NSString.
El text, imatges associades i posició es poden editar tant a
través d’IB com programàticament
d IB programàticament.
UIButton és una classe que permet generar botons a
l aplicació:
l’aplicació:
Es pot relacionar a una funció, que es cridarà en prémer el
botó.
De nou, tant el text com les imatges com la posició es poden
editar a través de IB i programàticament.
30. Continguts
Índex
Introducció al desenvolupament d’aplicacions per a iPhone –
Historia, estat de l’art i conceptes.
Fonaments d l d
F de la distribució d’aplicacions.
b ó d’ l
Eines de desenvolupament: Xcode i Interface Builder (IB).
Classes UIL b l i UIB
Cl UILabel UIButton a través de IB.
é d IB
Classe NSTimer: control de temps a la aplicació.
Hands
H d on coding: creació d’un petit joc amb tots els elements
di ió d’ tit j bt t l l t
anteriors.
31. NSTimer
NSTimer és una classe que permet crear un cronògraf
intern on es va cridant una funció cada vegada que passa
un determinat període de temps.
Es crea i instancia amb una funció de classe:
scheduledTimerWithTimeInterval:...
Aquesta funció incorpora un autorelease. Per tant, no es pot
fer release del timer (proveu a fer-ho...).
Per
P a aturar-lo i alliberar-lo cal cridar una funció específica, que
l llib l l id f ió ífi
és invalidate.
Un objecte de NSTimer es pot crear d’altres formes però
d altres formes,
aquesta és la automàtica.
32. Exemple 5
Crea un nou projecte tipus View-based.
Sobre l’arxiu AppViewController.h, afegeix:
pp g
NSTimer *myTimer;
int tCount;
Sobre l’arxiu AppViewController.c, busca viewDidLoad.
Dintre de la funció, implementa:
Di d l f ió i l
myTimer=[NSTimer scheduled TimerWithTimeInterval: 1.0 target:self selector:@selector(timerSpeaks)
userInfo:nil repeats:YES];
tCount=0;
En una funció separada, implementa:
-(void)timerSpeaks{
tCount++;
if(tCount 60){
if(tCount==60){
NSLog(@”Timer out”);
[myTimer invalidate];
}
else NSLog([NSString stringWithFormat:@”Happened %d seconds”, tCount]);
}
Com a exemple 6, proveu a fer la crida des d’AppDelegate en lloc de AppViewController...
33. Continguts
Índex
Introducció al desenvolupament d’aplicacions per a iPhone –
Historia, estat de l’art i conceptes.
Fonaments d l d
F de la distribució d’aplicacions.
b ó d’ l
Eines de desenvolupament: Xcode i Interface Builder (IB).
Classes UIL b l i UIB
Cl UILabel UIButton a través de IB.
é d IB
Classe NSTimer: control de temps a la aplicació.
Hands
H d on coding: creació d’un petit joc amb tots els elements
di ió d’ tit j bt t l l t
anteriors.
34. Hands on coding
Feu un joc amb tot el que heu après fins ara, que
respongui a aquestes especificacions:
El joc és un compte enrere de 10 segons on l’usuari ha de
tocar tantes vegades com pugui un botó fins que s’esgota el
d i b ó fi ’ l
temps.
El joc s inicia polsant un botó diferent.
s’inicia diferent
La vista ha de contenir aquests objectes:
2 UILabels, 2 UIButton
Els UILabels han d’informar de 2 coses:
Temps restant.
p
Vegades que s’ha premut el botó de puntuació.
35. Moltes gràcies per la seva atenció!
Introducció al desenvolupament
t oducc ó a dese o upa e t
d’aplicacions per a iOS
Enric Farguell Matesanz – efarguell@salle.url.edu
Dep. d’informàtica, Enginyeria i Arquitectura La Salle