Issuu on Google+

Curs de programació d’iOS Novembre de 2011

Organitza


Albert Nadal Garriga | Mobile software engineer

http://lafruitera.com

anadalg@gmail.com

twitter.com/anadalg


Sistema Operatiu iOS Terminals iPhone, iPod Touch, iPad - iPhone 4S - iPhone 4 - iPhone 3GS - iPhone 3G - iPhone

- iPad 2 - iPad


Repositori d’aplicacions App Store Available apps 500.000+ Downloads 18.000.000.000+


Use cases of Apps • • • • • • • • •

Location-Based Services (LBS) News and media content Entertainment and games Guides and reference Navigation eBooks Augmented Reality (AR) Healthcare Social Networks


Location-Based Services (LBS)


News and media content


Guides and reference


Interactive eBook


App life cycle


1 Introducció a l’Xcode i iOS • • • • • • • •

Requisits i material necessari iOS Developer Program Certificat de desenvolupador Certificat de distribució Apple App Store Xcode i Interface Builder Estructura d’un projecte Novetats de l’iOS5


1.1 Requisits i material necessari • Mac OS X • v10.7 (Lion) • v10.6 (Snow Leopard)

• Xcode • v4.2 (iOS ≤ 5 SDK) • v3.2 (iOS ≤ 4.3 SDK) • Interface Builder • Integrat amb Xcode v4.0


1.2 iOS Developer Program • http://developer.apple.com/support/ios/ • Certificat de desenvolupador d’Apple


1.3 Certificat de desenvolupador • Developer Certificate: Certificat digital que s’instal·la al keychain del Mac mitjançant l’aplicació “Acceso a llaveros”. Signa digitalment el codi de les nostres Apps. • App ID: Identificador de la nostra aplicació a l’App Store. • El bundle identifier de l’App ha de tenir aquest valor. • El bundle identifier està al fitxer nomApp-Info.plist • Device ID (UDID): Identificador únic de cada dispositiu. • Permet executar les nostres app al terminal en devel. • Permet distribuïr les nostres apps en mode Adhoc.

• Provisioning Profile: Permet executar les Apps al terminal. • Relaciona App ID, Device ID.


1.4 Certificat de distribució • Permet pujar les nostres aplicacions a l’App Store. • Permet enviar les nostres Apps via Adhoc a tercers.


1.5 Apple App Store • • • •

Repositori d’aplicacions. App Store Worldwide. App Store per país. Normes força estrictes • Seguir les guies d’estils d’Apple • No continguts per a adults • Aplicacions estables • Logos de tercers ben visibles (google, etc…) • No estafes • No emprar API’s privades • No emprar icones/logos d’Apple • etc…


1.6 Xcode i Interface Builder • Xcode v4.2 • Interface Builder (integrat dins de l’Xcode 4)


Interface Builder fitxers .NIB i .XIB contenen la definició de la interfície gràfica


1.7 Estructura d’un projecte • Source code • Fitxers .h • Fitxers .m

• Resources/Bundle • • • •

• • • •

Imatges Video Fitxer de base de dades (SQLite, XML, etc…) etc…

Configuració de l’app .plist Interfície Gràfica .NIB i .XIB Llibreries dinàmiques .dylib Localització .strings


2 Crear un projecte amb Xcode


Classe HolaMonAppDelegate.h • Tot projecte te el corresponents fitxers… • NomAplicacioAppDelegate.h • NomAplicacioAppDelegate.m

• NomAplicacioAppDelegate és la classe principal de l’aplicació i fa tasques de “director d’orquestra”. • És subclasse de UIApplication o UIResponder. • Implementa el protocol <UIApplicationDelegate> • Actua com un listener de missatges de l’App: • Quan s’inicia l’aplicació. • Quan l’aplicació passa a segon plà (multitasca). • Quan l’aplicació passa a primer plà. • Quan l’aplicació es tanca. • Etc…


Classe HolaMonAppDelegate.h #import <UIKit/UIKit.h> @class HolaMonViewController; @interface HolaMonAppDelegate : UIResponder <UIApplicationDelegate> { }

@property (strong, nonatomic) UIWindow *window; @property (strong, nonatomic) HolaMonViewController *viewController;

@end


Classe HolaMonAppDelegate.m #import "HolaMonAppDelegate.h" #import "HolaMonViewController.h" @implementation HolaMonAppDelegate

@synthesize window = _window; @synthesize viewController = _viewController; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { /* Invocat quan l’aplicació ha arrancat */ }

- (void)applicationWillResignActive:(UIApplication *)application { /* Invocat quan l’aplicació passa a un estat inactiu (es rep una trucada o sms, o es prem el botó del dispositiu */ } - (void)applicationDidEnterBackground:(UIApplication *)application { /* Si l’aplicació suporta multitasca i passa a segon plà s’invoca aquest mètode */ } - (void)applicationWillEnterForeground:(UIApplication *)application { /* Invocat quan l’aplicació recupera el primer plà */ } - (void)applicationDidBecomeActive:(UIApplication *)application { /* */ } - (void)applicationWillTerminate:(UIApplication *)application { /* Invocat quan l’aplicació es tancarà */ } @end


Exemple 1 - UIAlertView • • • •

Mostrar una alerta en una caixa flotant. Tindrà dos botons: Sortir i Continuar. Al prèmer el botó Sortir es tancarà l’App. S’emprarà la classe UIAlertView

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@”Avís!” message:@“Escull una de les següents opcions.” delegate:self cancelButtonTitle:@“Sortir” otherButtonTitles:@”Continuar”, nil]; [alert show]; [alert release];


Exemple 1 #import "HolaMonAppDelegate.h" #import "HolaMonViewController.h" @implementation HolaMonAppDelegate @synthesize window = _window; @synthesize viewController = _viewController; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@”Avís!” message:@“Escull una de les següents opcions.” delegate:self cancelButtonTitle:@“Sortir” otherButtonTitles:@”Continuar”, nil];

[alert show]; [alert release]; self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; [self.window makeKeyAndVisible]; return YES; } @end


Exemple 1


Exemple 1 • Implementarem les actions dels botons Sortir i Continuar. • Primerament declarem el protocol <UIAlertViewDelegate> http://developer.apple.com/library/ios/#documentation/uikit/reference/UIAlert ViewDelegate_Protocol/UIAlertViewDelegate/UIAlertViewDelegate.html

• Només cal implementar els mètodes delegats que ens interessen. • En aquest cas el mètode delegat que ens interessa és...

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { /* Implementar-ho! */ }


Exemple 1 • Declarem el protocol <UIAlertViewDelegate> al fitxer de definició d’interfície de la classe NomAplicacioAppDelegate (NomAplicacioAppDelegate.h) * Podem declarar protocols en qualsevol altra classe. #import <UIKit/UIKit.h> @class HolaMonViewController; @interface HolaMonAppDelegate : UIResponder <UIApplicationDelegate, UIAlertViewDelegate> { } @property (strong, nonatomic) UIWindow *window; @property (strong, nonatomic) HolaMonViewController *viewController; @end


Exemple 1 • Ara cal implementar el protocol delegat al fitxer d’implementació de la classe NomAplicacioAppDelegate (NomAplicacioAppDelegate.m) #import "HolaMonAppDelegate.h" #import "HolaMonViewController.h" @implementation HolaMonAppDelegate @synthesize window = _window; @synthesize viewController = _viewController; [....]

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {

switch (buttonIndex) { case 0: case 1: default: break;

} }

exit(0); break; /* Implementar acció del botó "Continuar" */ break;


#import "HolaMonAppDelegate.h" #import "HolaMonViewController.h" @implementation HolaMonAppDelegate @synthesize window = _window; @synthesize viewController = _viewController; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@”Avís!” message:@“Escull una de les següents opcions.” delegate:self cancelButtonTitle:@“Sortir” otherButtonTitles:@”Continuar”, nil]; [alert show]; [alert release]; self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; [self.window makeKeyAndVisible]; return YES; } - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { switch (buttonIndex) { case 0: exit(0); break; case 1: /* Implementar acció del botó "Continuar" */ break; default: break; } }

@end


Exemple 2 – Model-View-Controller • Definirem un UIViewController (MVC) • Mostrar una pantalla amb un UITextField, UILabel i un UIButton • Definirem els IBOutlets • Definirem un IBAction per al UIButton

• Realitzarem els connectors entre UI i el codi


Exemple 2 • UIViewController (Model-View-Controller) • View: Objectes visibles per a l’usuari. • • • • •

UILabel UIButton UIImageView UITextField Etc...

• Model: Objectes per guardar dades • • • •

NSArray NSDictionary SQLite Etc...

• Controller: Enllaça i controla la vista i el model.


Exemple 2 • Creem una classe de tipus UIViewController principal anomenat HolaMonViewController. S’encarregarà de controlar tots els elements que afegirem en una vista de l’App. • HolaMonViewController.h #import <UIKit/UIKit.h> @interface HolaMonViewController : UIViewController @end

• HolaMonViewController.m #import "HolaMonViewController.h“ @implementation HolaMonViewController [....]

@end


Exemple 2 • Creem una instància de HolaMonViewController i l’associarem a una interfície gràfica on hi afegirem les subvistes.

HolaMonViewController.xib

• La instància la crearem i guardarem a la classe HolaMonAppDelegate i s’ha de fer quan arrenca l’aplicació. • HolaMonAppDelegate.m - (BOOL)application: (UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *) launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; self.viewController = [[HolaMonViewController alloc] initWithNibName:@”HolaMonViewController” bundle:nil]; self.window.rootViewController = self.viewController; [self.window makeKeyAndVisible]; }


Exemple 2 • Afegim un UIButton, UILabel i UITextField a la interfície HolaMonViewController.xib • El File’s Owner ha de sér del tipus HolaMonViewController


Exemple 2 • Per poder accedir i utilitzar les tres subvistes que hem afegit a la interfície hem de definir-les com a atributs IBOutlet de la classe HolaMonViewController • Per capturar l’event al prémer l’UIButton defirem un mètode IBAction • HolaMonViewController.h #import <UIKit/UIKit.h> @interface HolaMonViewController : UIViewController { IBOutlet UILabel *etiqueta; IBOutlet UITextField *input; IBOutlet UIButton *boto; }

- (IBAction)copiarText:(id)sender; @end


Exemple 2 â&#x20AC;˘ Apliquem els connectors entre la interfĂ­cie i els IBOutlet


Exemple 2 • Apliquem els connectors entre la interfície i els IBAction


Exemple 2 • Implementem el mètode copiarText • Al prémer el UIButton copiarem el text de l’UITextField a l’UILabel

• HolaMonViewController.m #import "HolaMonViewController.h“ @implementation HolaMonViewController - (IBAction)copiarText: (id)sender { [etiqueta setText:[input text]]; } [....] @end


Exemple 2


Exemple 2 • Implementarem l’amagament del teclat al prémer la tecla de retorn • Declararem i implementarem el protocol <UITextFieldDelegate> • HolaMonViewController.h #import <UIKit/UIKit.h> @interface HolaMonViewController : UIViewController <UITextFieldDelegate> { IBOutlet UILabel *etiqueta; IBOutlet UITextField *input; IBOutlet UIButton *boto; } - (IBAction)copiarText:(id)sender; @end


Exemple 2 http://developer.apple.com/library/ios/#documentation/uikit/reference/UITextFi eldDelegate_Protocol/UITextFieldDelegate/UITextFieldDelegate.html

• Implementem el protocol <UITextFieldDelegate> al delegate • HolaMonViewController.m #import "HolaMonViewController.h“ @implementation HolaMonViewController - (BOOL)textFieldShouldReturn: (UITextField *)textField { [textField resignFirstResponder]; [etiqueta setText:[input text]]; return TRUE; } [....] @end


Exemple 2 • Ara cal assignar el delegate al UITextField des de l’Interface Builder • S’assignarà mitjançant un connector


Exemple 2


3 Introducció a l’Objective-C • Les aplicacions per iOS es desenvolupen en llenguatge Objective-C • És una extensió simplificada del C • Programació orientada a objectes

• L’SDK es composa d’un conjunt de Frameworks • Tot el conjunt s’anomena Cocoa • En els dispositius tàctils s’empra Cocoa Touch


• Hi ha més de 3000 mètodes i 200 classes disponibles. • En cada nova actualització de l’iOS Apple afegeix noves classes i mètodes. • Cal emprar constantment els exemples i la documentació de referència d’Apple. • http://developer.apple.com/library/ios/naviga tion/


Frameworks • Un framework és un conjunt de classes relacionades entre si que realitzen tasques similars • Només cal importar al nostre projecte els frameworks necessaris • Per exemple, el framework UIKit s’empra en tots els projectes per iPhone/iPad ja que conté totes les classes relatives a la interfície d’usuari • UIButton, UILabel, UIImageView, UIView, UIScrollView, UISegmentedControl, UISlider, UITextField, UISwitch,... • Etc...


Frameworks


Frameworks


Frameworks


Frameworks • Foundation: Tipus primitius de dades, etc... http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Fou ndation/ObjC_classic/_index.html

• UIKit: Classes de la UI http://developer.apple.com/library/ios/#documentation/uikit/reference/UIKit_Fr amework/_index.html

• CoreGraphics: Motor de renderitzat de la UI http://developer.apple.com/library/ios/#documentation/coregraphics/reference/ coregraphics_framework/_index.html


Frameworks •CoreLocation: GPS/Brúixola/Geolocalització •MapKit: Integració de mapes •SystemConfiguration •CFNetwork: Comunicació/Sockets •AddressBook: Accés agenda de contactes •MediaPlayer: Player de video/audio/streaming? •CoreBluetooth: Ús bluetooth •AudioToolbox: Manipulació d’audio •iAd: Integració publicitat iAd d’Apple •Etc...


Curs de desenvolupament d'iOS - Part 1/5